Сейчас на форуме: (+4 невидимых) |
eXeL@B —› Программирование —› Формат для передачи данных между потоками |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 02 января 2020 21:54 · Личное сообщение · #1 |
|
Создано: 05 января 2020 20:51 · Личное сообщение · #2 difexacaw пишет: Скорее он не хочет говорить про то, что нам знать не нужно. Наш скилл вангователей уже настолько прокачан, что нам и не нужно этого говорить. Мы и так лучше него знаем, что он на самом деле хочет. Пусть гуглит, что такое маршалинг и реализует его, без всяких там нотифи из ядра в юзермод и отловов разрушенных указателей визорами |
|
Создано: 05 января 2020 20:56 · Личное сообщение · #3 |
|
Создано: 05 января 2020 21:18 · Личное сообщение · #4 |
|
Создано: 05 января 2020 21:51 · Личное сообщение · #5 galenkane пишет: Сделал вот так https://gist.github.com/lurumdare/d3a8558f544fe1cabf9f1fc2d6bdf179 Если функция не завершается после создания потока, по передаче параметров пойдёт. Но там стоит Sleep() - никогда нельзя полагаться на то, что какой-то поток обязательно выполнится в такое-то время. Сделай просто указатель на объект глобальным! Добавлено спустя 9 минут galenkane пишет: ARCHANGEL задача как бы есть мб вы не поняли ее главное чтобы они были на стеке Чё тогда не вставить в конце main() и везде, где вызывается CreateThread() с передачей указателя на объект на стеке, простую функцию WaitForSingleObject(hThread, INFINITE). Кстати, malloc() получает адрес не из стека, а из кучи. Есть calloc(), она выделяет память прямо на стеке. Считаю опасной функцией для использования серьёзно на практике. Вообще любую структуру можно именно на стеке инициализировать Code:
Добавлено спустя 13 минут rmn пишет: Причем здесь вообще какой-то стек? galenkane пишет: главное чтобы они были на стеке rmn, ну что непонятного? Ему просто так ОЧЕНЬ нужно. Можно так сделать. Добавлено спустя 16 минут По-моему, ТС прежде, чем ставить задачи(или выполнять), нужно сначала разобраться, что такое стек, потоки и как они связаны. ----- IZ.RU |
|
Создано: 05 января 2020 22:21 · Личное сообщение · #6 |
|
Создано: 05 января 2020 22:24 · Личное сообщение · #7 |
|
Создано: 05 января 2020 22:28 · Личное сообщение · #8 DenCoder пишет: но не использовал никогда ) Да и не надо. Компилер сам ее вставляет, если локальных переменных больше, чем на 4кб. Ты можешь просто без задней мысли писать Code:
и безопасно работать со всем массивом. Для того апи и создают, чтобы при написании каждой программы ядра не дебажить и визорами ничего не ловить |
|
Создано: 06 января 2020 01:18 · Личное сообщение · #9 rmn Визорами.. что бы с этим работать нужно многое знать и не базовые вещи. Зачем ты упоминаешь их там где это не уместо. DenCoder > Чё тогда не вставить в конце main() и везде, где вызывается CreateThread() с передачей указателя на объект на стеке Задача не известна, нельзя даже что то предположить. Зачем трогать стек, система прибьёт поток если что то пойдёт не так, например если переключить стек на область, но ядро проверит это при аллокации памяти и защита сразу прикончит процесс. ----- vx |
|
Создано: 06 января 2020 02:08 · Личное сообщение · #10 difexacaw пишет: Задача не известна, нельзя даже что то предположить. Очевидно же, что он хочет запилить выполнение произвольной функции в новом потоке, причем, чтобы в коде это выглядело как просто вызов функции. Добавлено спустя 6 минут difexacaw пишет: Зачем ты упоминаешь их там где это не уместо. А ты? |
|
Создано: 06 января 2020 02:26 · Личное сообщение · #11 |
|
Создано: 06 января 2020 04:41 · Поправил: galenkane · Личное сообщение · #12 |
|
Создано: 06 января 2020 12:12 · Поправил: difexacaw · Личное сообщение · #13 Дайте повангую, может есть готовое.. Code:
Но лучше такое не юзать, это идёт поперёк защиты. ----- vx |
|
Создано: 06 января 2020 13:09 · Личное сообщение · #14 можно спорить до бесконечности. Но. Постановки задачи так и не было. Разместить данные на стеке - зачем? Зачем для этого потоки? Потоки в одном или в разных процессах? galenkane Если вы переживаете за свой невероятно прогрессивный малварный алгоритм - то я вас умоляю, тут он не впал никому. Пишите задачу как есть, мы исключительно в образовательных целях её рассмотрим. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 06 января 2020 13:19 · Личное сообщение · #15 ARCHANGEL Могу предположить зачем именно нужен стек. Борьба в Стековая память имеет локальное поведение, так guard страница снимается только при выборке из текущего треда, для удалённого чтения снятие гварда приводит к детекту - не подтверждённой попытке выборки. А есчо передача параметров в сервисы должна идти через стек, некоторые его проверяют и если он вне диапазона, который был при создании треда, ядро закончит процесс. ----- vx |
|
Создано: 06 января 2020 20:38 · Личное сообщение · #16 |
|
Создано: 06 января 2020 21:46 · Поправил: DenCoder · Личное сообщение · #17 galenkane пишет: DenCoder указатель на объект глобальным? это как? На стеке - локально. Добавлено спустя 3 минуты Чтобы передавать из main() локальные данные в функцию в другом потоке, функцию ожидания нужно вставить. Или ждёшь нажатия клавиши, или пакета по сети, по USB, или (проще будет) ждёшь завершения потока, в который передал указатель на локальные данные из главного потока. ----- IZ.RU |
|
Создано: 06 января 2020 21:57 · Поправил: galenkane · Личное сообщение · #18 DenCoder пытался сделать на примере ожидание потока, что-то пошло не так. Создавал поток ожидающим, давал ему приоритет, потом вызывал ResumeThread. Не работает. Добавлено спустя 4 минуты Опишу задачу. Есть много ООП. Код делаем с виртуальными функциями. Эти самые функции вызываем в потоках. Допустим три-четыре потока с синхронизацией. И крутим данные между ними. Защита в том, что данные будут в разных местах. И чтобы отследить такое, придется изрядно постараться. |
|
Создано: 06 января 2020 23:03 · Личное сообщение · #19 |
|
Создано: 06 января 2020 23:08 · Личное сообщение · #20 |
|
Создано: 06 января 2020 23:14 · Поправил: DenCoder · Личное сообщение · #21 |
|
Создано: 06 января 2020 23:17 · Личное сообщение · #22 |
|
Создано: 06 января 2020 23:40 · Личное сообщение · #23 |
|
Создано: 06 января 2020 23:41 · Личное сообщение · #24 DenCoder > main() завершится, что станет с "данными на стеке"? Интересный вопрос кстати. Обычно ведь не происходит понижения вложенности, те возврата из серии процедур до завершения потока. А удаление стека настраивается: Code:
> Допустим три-четыре потока с синхронизацией. И крутим данные между ними. Если потоки в одном АП, то достаточно глобальной переменной и локальной синхронизации. ----- vx |
|
Создано: 06 января 2020 23:43 · Личное сообщение · #25 |
|
Создано: 06 января 2020 23:46 · Личное сообщение · #26 |
|
Создано: 06 января 2020 23:51 · Поправил: difexacaw · Личное сообщение · #27 galenkane slim-RWL, единственный способ сделать быстро. Иначе есть сотни всяких синхронизаций, семафоры евенты etc. Вот тут ----- vx |
|
Создано: 07 января 2020 00:02 · Личное сообщение · #28 |
|
Создано: 07 января 2020 00:05 · Личное сообщение · #29 |
|
Создано: 07 января 2020 00:07 · Личное сообщение · #30 |
|
Создано: 07 января 2020 00:12 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Формат для передачи данных между потоками |
Эта тема закрыта. Ответы больше не принимаются. |