Процесс

H

haker_fox

Процесс или нить (в общем многозадачность) Windows

Доброго времени суток, коллеги!!! Вот хочу, чтоб в отдельном процессе у меня с заданной переодичностью выполнялось некое действи (опрос последовательного порта). Для периодичности можно использовать компонент таймер (C Builder 6.0, вкладка SYSTEM). Но, как этот таймер запустить в отдельном процессе? А может есть другие решения, которые помогут обойтись без таймера? Что-то типа функции void delay(int ms), которая может обеспечивать задерку на заданное число миллисекунд? Отдельный процесс нужен потому, как при тайм-ауте порта будут некоторые тормоза, а основная прога должна работать без тормозов agadou14

Кому удобно, вот ICQ 339085018.
 
Last edited by a moderator:
H

haker_fox

Все придумал

Просто создаем отдельный процесс и крутим в нем бесконечный цикл, а для периодичности юзаем винапишную функцию Sleep(...)

Examlpe:

while(1)
{
//Code :mod:
Sleep(100); ..например задержка на 100 мс agadou14
}
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Под Windows (да и под любую нормальную систему) это будет очень дурным тоном.

Используй, например, multimedia timer (timeSetEvent, timeKillEvent) - он будет работать в отдельном потоке. На Callback функцию TimeProc повесь свой обработчик.

Смотри подробное описание в MSDN, а также посмотри описание функций WaitFor...
Наверняка пригодятся, особенно в виде WaitForSingleObject(Thread.Handle, RunTime);

Почитай Джеффри Рихтера :)
 
H

haker_fox

???

Под Windows (да и под любую нормальную систему) это будет очень дурным тоном.

Интересно, а почему? Кстати мне второй раз уже советуют использовать для подобных целей таймер.
 
Last edited by a moderator:

GI80

Member
Joined
Aug 10, 2005
Messages
178
Reaction score
14
Age
44
Location
Москва
haker_fox, убедительная просьба воздержаться от постов подобных последнему (т.е. не несущих какой-либо информации). Если хочешь кому-то сказать спасибо жми на кнопочку "добавить к репутации".
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
У функций Sleep и SleepEx очень ограниченные области применения - либо явное указание планировщику, что данный квант процессорного времени больше потоку не нужен (в виде Sleep(0)), либо опять-таки однократное прекращение выполнения потока до того момента, когда закончится операция ввода-вывода (SleepEx(...)), либо для отладочных целей.

Чем плохи эти функции в контексте работы планировщика? Во-первых, если поток работает с очередью событий, то засыпание просто противопоказано, например:
MSDN begin ---
You have to be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. If you have a thread that uses Sleep with infinite delay, the system will deadlock. Two examples of code that indirectly creates windows are DDE and COM CoInitialize. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.
MSDN end ---

Но это наверное не твой случай. В твоём случае нужно, чтобы планировщик знал, что поток будет постоянно, с заданным интервалом получать процессорное время. Для этого предназначены таймеры и функции семейства WaitFor...
Причём в зависимости от относительного приоритета потока, его взаимодействия с памятью, Processor affinity mask (нормального русского перевода не знаю) и интервала таймера планировщик (в теории) сможет выстроить осмысленную политику выделения процессорного времени.

Посмотри, для чего народ использует Sleep:
http://www.all-net.ru/Library/Articles/Programming/BaseService/ProcessesAndStreams/LiveObj/

В принципе, тема необъятная, это я так - коснулся. Лучше приобщись к первоисточникам.
 
Top