2013-05-20 4 views
0

В моем текущем проекте у меня есть структура вроде этого:создание DELPHI таймеров динамически во время выполнения (производительность, CPU потребляющий)

Main Thread (GUI): 
->Parser Thread 
->Healer Thread 
->Scripts Thread 

проблемы в том, что целитель & скрипты Тема должна создать childthreads с их нашими правилами таймера , это будет выглядеть следующим образом:

->Parser Thread 
->Healer Thread: 
-->Healer 1 
-->Healer 2 
--> (...) 
->Scripts Thread: 
-->Script 1 
--> (...) 

для этого я подумал о кодировании динамически таймер, который будет создан во время выполнения, когда добавляется новый Исцели/Script.

Теперь проблема/вопрос: Возможно, у меня есть 20 таймеров, запускаемых одновременно из-за этого, не будет ли это проблемой для моей производительности программы (потребление процессора и т. Д.)? Это лучший способ добиться того, что я ищу?

Заранее спасибо

+1

20 таймеров не проблема. В качестве альтернативы вы можете создавать таймеры с функцией ['SetTimer'] (http://msdn.microsoft.com/cs-cz/library/windows/desktop/ms644906 (v = vs.85) .aspx) и иметь один обычный обработчик сообщения 'WM_TIMER'. Но подождите, где вы хотите иметь этих таймеров? В потоках? – TLama

+1

Если вы уже знаете темы, почему вы беспокоитесь о таймерах? Поместите соответствующую нить (ы) в «Сон» и вуаля. – OnTheFly

+0

@ user539484, так что я должен создать новый поток (ScriptsThreadChild) для управления дочерними элементами, созданными ScriptsThread? И если это правильно, могу ли я запустить этот ScriptsThreadChild.execute() столько раз, сколько необходимо? например, если дочерние потоки будут выполняться в параллельном порядке под одним и тем же ScriptThreadChild.pas – user2308704

ответ

1

Там нет никаких проблем с наличием до 20 таймеров активных в одно время в приложении. Современное оборудование более чем способно справиться с этим.

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

Большая проблема для вас заключается в том, что вы не можете создавать экземпляры TTimer вне потока графического интерфейса/VCL. Это связано с тем, что компонент таймера вызывает AllocateHWnd, который не является потокобезопасным и может быть вызван только из потока GUI/VCL. Таким образом, вам необходимо напрямую взаимодействовать с необработанным API-интерфейсом Win32 и не использовать обертку VCL TTimer.

+0

oux, так что я могу создать SetTimer без потока графического интерфейса? или есть лучший/более простой способ? // @TLama: да, поскольку каждый Thread (healer/scripts) должен создавать дочерние потоки с их подходящими снами, это единственное, что мне пришло. – user2308704

+1

Даже используя необработанный API-интерфейс Win32 ['все равно потребует цикл сообщений] (http://stackoverflow.com/questions/11244848/delphi-timer-inside-thread-generates-av#comment14790920_11253254) внутри потока. Для обходного решения посмотрите, например. на ['this Q & A'] (http://stackoverflow.com/q/11244848/960757) :-) – TLama

+1

@ user2308704 Вы можете вызывать' SetTimer' из любого потока, но если вы это сделаете, вы должны обслуживать очередь сообщений в этом потоке –