Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Как выводить статус от нескольких потоков?   Найти похожие ветки 

 
GrayFace ©   (2006-03-06 14:57) [40]

Leonid Troyanovsky ©   (03.03.06 13:15) [24]
Т.е., налицо все, что требуется от синхронизации.
Кстати, в ранних версиях дельфи она так и реализовывалась.

Не только в ранних. В Delphi 7 это тоже так.

MegaVolt
Обновлять статистику, по-моему, лучше всего методом [9]+[22]. В [22] написана ерунда про SendMessage, но алгоритм с Post описан верно и должен дать наилучший результат.

Leonid Troyanovsky ©   (03.03.06 13:43) [26]
Зачем в цикле? Запустил поток - inc, закончился поток - dec.
Т.е., если значение больше допустимого - не запускаем.

Точнее, запуск - InterlockedIncrement, завершение - InterlockedDecrement и PostMessage гл. потоку. Главный поток вначале запускает потоков до предела, потом запукает потоки при получении сообщений.

Запись в файл - точно так же - PostMessage и запись в главном или записывающем потоке. Но не WM_COPYDATA, а свое сообщение с указателем и размером в параметрах. Записывающий поток после записи будет освобождать память.


 
Leonid Troyanovsky ©   (2006-03-06 15:12) [41]


> GrayFace ©   (06.03.06 14:57) [40]

> Не только в ранних. В Delphi 7 это тоже так.


Не совсем.
Начиная с D5 - очередь где-то в районе Application.Idle.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-03-06 15:18) [42]


> GrayFace ©   (06.03.06 14:57) [40]


> Точнее, запуск - InterlockedIncrement, завершение - InterlockedDecrement
> и PostMessage гл. потоку. Главный поток вначале запускает
> потоков до предела, потом запукает потоки при получении
> сообщений.

ILI, IDI не обязательны. Конструктор и OnTerminate
выполняются в первичном потоке.

> или записывающем потоке. Но не WM_COPYDATA, а свое сообщение
> с указателем и размером в параметрах. Записывающий поток
> после записи будет освобождать память.

Почему "но"? Хочется асинхронности - Post.
Для синхронности SendMessage, а WM_COPYDATA - сгодится
для любых потоков, даже из других процессов.

--
Regards, LVT.


 
MegaVolt ©   (2006-03-06 15:39) [43]

>И просматривать 100Мб в блокноте. Ню-ню.

Зачем это? Специально заточенная прога просматривает этот файлик практически мгновенно :)

Из всего рассуждения я понял что и Post и Send подходят только один притормаживает поток а второй нет и возможна ситуация когда придёт сообщение от мёртвого потока. Но оба метода потокобезопасны?


 
isasa ©   (2006-03-06 16:04) [44]

С WM_COPYDATA Post не получится, только Send.


 
GrayFace ©   (2006-03-06 16:30) [45]

Я имелл ввиду метод из [20], а не [22]


 
isasa ©   (2006-03-06 16:40) [46]

Хотя MSDN стало не таким категоричным

MSDN January 2000

WM_COPYDATA
An application sends the WM_COPYDATA message to pass data to another application.

To send this message, call the SendMessage function with the following parameters (do not call the PostMessage function).

MSDN January 2006

WM_COPYDATA Message

--------------------------------------------------------------------------------

An application sends the WM_COPYDATA message to pass data to another application.

Syntax

To send this message, call the SendMessage function as follows.



 
Leonid Troyanovsky ©   (2006-03-06 16:42) [47]


> MegaVolt ©   (06.03.06 15:39) [43]

> оба метода потокобезопасны?


Рефрен: PostMessage (with GetMem & FreeMem in the work thread) -
асинхронная обработка.
SendMessage - синхронная обработка, с возможностью выполнения
любого кода в обработчике сообщения.

Обработка и того и другого происходит в контексте первичного
потока и является потокобезопасным. Однако, следует обратить
пристальное внимание на время жизни локальных переменных
(если ссылки на таковые присутствуют в параметрах сообщения),
которое критично для асинхронной обработки.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-03-06 16:49) [48]


> isasa ©   (06.03.06 16:04) [44]
> С WM_COPYDATA Post не получится, только Send.


Влом проверять, но PostMessage with WM_COPYDATA, посылаемое
внутри процесса не должно принципиально отличаться от любого,
скажем, WM_USER. Т.е., посылаемые указатели будут всегда
действительны, однако гарантий того, что данные по этому
указателю не будут освобождены посылающим до окончания
обработки никто не даст.

--
Regards, LVT.


 
GrayFace ©   (2006-03-06 16:59) [49]

Я уж отвык от скорости обсужнения, сравнимой с чатом.

Leonid Troyanovsky ©   (06.03.06 15:18) [42]
ILI, IDI не обязательны. Конструктор и OnTerminate
выполняются в первичном потоке.

Да, о них я не подумал. OnTerminate будет хорошо, проще. Единственное но - если может выполниться раньше, чем прийдет сообщение сообщение об обновлении статуса. Хотя, тоже не проблема - вызвать вначале Application.ProcessMessages и все.

В общем, PostMessage будет побыстрее и особых проблем, я думаю, не вызовет - PocessMessages в OnTerminate должен их ликвидировать.



Страницы: 1 2 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
15-1142442463
TStas
2006-03-15 20:07
2006.04.09
Как называется программа?


15-1142449191
TStas
2006-03-15 21:59
2006.04.09
Как устроен клавиатурный шпион?


2-1143478492
BOB_KAMIKAZE
2006-03-27 20:54
2006.04.09
ПАНЕЛЬ ЗАДАЧ


11-1123713644
Thaddy
2005-08-11 02:40
2006.04.09
Why does kol and D2005 seem to work only in PAS_VERSION mode?


1-1141459613
webpauk
2006-03-04 11:06
2006.04.09
Вставка control