![]() |
![]() |
![]() |
|
Delphi: пасквилянты есть здесь? Пара вопросов | ☑ | ||
---|---|---|---|---|
0
Коллайдер
16.08.09
✎
17:52
|
1. Как запустить поток (thread) с передачей ему параметра (ов).
2. Как между потоками гонять поток инфы? зы через глобальные переменные не устраивает - количество потоков м.б. переменное |
|||
1
ШтушаКутуша
16.08.09
✎
17:57
|
(0) вручную запаришься передавать, но!
обмен данными между потоками наз. маршаллингом данных это стандарная "процедура" в COM. |
|||
2
v77
16.08.09
✎
18:09
|
1. Можно перегрузить конструктор потока, добавив в него параметры. Можно добавить новые свойства к классу потока, и они будут параметры.
2. Опять свойства класса потока. Только нужно обеспечить безопасное чтение/запись переменных. Курить синхронизацию (мьютексы и т.п) |
|||
3
Torquader
16.08.09
✎
18:13
|
Поток создаётся WinApi функцией CreateThread где передаются параметры потока, а также указатель на область данных, которые можно передать потоку при инициализации.
У всех потоков общая память - поэтому, или выделять блок памяти и передавать на него ссылку или через "стандартные тормоза COM". Насколько я понимаю, если потоков очень много, то каждый поток получает задание, а потом отчитывается о его выполнении - тогда можно использовать даже стандартный обмен сообщениями Windows (кстати, COM обычно работает через него), только в вашем случае открывается возможность использования собственных сообщений WM_USER+1 и т.д. |
|||
4
Коллайдер
16.08.09
✎
18:20
|
ок. пошел делать
|
|||
5
Кириллка
16.08.09
✎
18:37
|
(3)у потоков, видимо, должны быть окна, чтобы сообщения гонять?
|
|||
6
Serginio1
16.08.09
✎
18:41
|
(0) Так или иначе все сообщения передаются через очередь (оконные, потоковые, маршалинг интерфейсов, APC). Либо создай свою очередь и проверяй её в определенных местах.
|
|||
7
Rie
16.08.09
✎
18:43
|
(5) Не обязательно.
|
|||
8
Кириллка
16.08.09
✎
18:45
|
(7)а как без окон сообщениями WM_XX обмениваться?
|
|||
9
romix
модератор
16.08.09
✎
18:49
|
Через глобальные переменные м.б. понятнее но там обязательно ! надо еще юзать функции для разруливания потоков типа EnterCriticalSection/LeaveCriticalSection. Тогда они не полезут вдвоем и более в одну переменную (пример у Рихтера - два человека в одну туалетную кабинку). А вообще полезная книжка вот эта:
http://www.ozon.ru/context/detail/id/116668/ Всего не упомнишь, там как раз такие вещи. Где то есть электронное издание. |
|||
10
Torquader
16.08.09
✎
18:50
|
Так у каждого потока есть своя очередь сообщений, которая создаётся системой при первом же запросе GetMessage, а то, что нет окон - даже хорошо - сообщения можно принимать прям в главной процедуре.
|
|||
11
Кириллка
16.08.09
✎
18:55
|
Вы мне мозг разрушаете...
Создав поток, при помощи CreateThread, вы собрались ему слать сообщения, при помощи SendMessage? |
|||
12
Кириллка
16.08.09
✎
18:56
|
+11 в дельфи свой винапи?
|
|||
13
Torquader
16.08.09
✎
18:56
|
Вот что описано про процедуру передачи сообщения потоку:
The PostThreadMessage function places (posts) a message in the message queue of the specified thread and then returns without waiting for the thread to process the message. BOOL PostThreadMessage( DWORD idThread, // thread identifier UINT Msg, // message to post WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); SendMessage использовать нельзя, так как оно "тупо" вызывает оконную процедуру, которой у нас пока нет. |
|||
14
Torquader
16.08.09
✎
18:56
|
Только поток получит сообщение не сразу, а как только "заглянет в очередь" - очень удобно для рассылки заданий.
|
|||
15
Кириллка
16.08.09
✎
19:22
|
(13)да тоже самое, окно должно быть:
" Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function. Therefore, if the recipient thread is in a modal loop (as used by MessageBox or DialogBox), the messages will be lost. To intercept thread messages while in a modal loop, use a thread-specific hook. " |
|||
16
Кириллка
16.08.09
✎
19:28
|
(0)Какие-то сложности на пустом месте создают с маршалингом и тп...
Используя объекты синхронизации (мьютексы, семафоры, события) делается все, что нужно. В простом случае, выделяем память под буфер, передаем указатель на него в потоки, а при работе с этим буфером одним из потоков, выставляем мьютекс, после сбрасываем мьютекс. Таким образом никто не будет пользоваться общим буфером из разных потоков одновременно. |
|||
17
Rie
16.08.09
✎
19:31
|
(15) Посмотри у Рихтера насчёт того, как и куда отправляются сообщения.
|
|||
18
Жан Пердежон
17.08.09
✎
10:50
|
(0) курить класс TThread
в делфе даже пример есть хороший по работе с потоками |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |