Текущий архив: 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.54 MB
Время: 0.013 c