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

Вниз

ProcessMessages... и другие   Найти похожие ветки 

 
rams   (2004-05-12 11:33) [0]

В компе стоит плата сбора данных. Есть потребность считывать с нее данные (чем больше частота опроса - тем лучше, реально 500 Гц - это уже около хорошо). Если просто в цикле считывать все работает отлично - скорость устраивает
Т.е. такой цикл

repeat
 Read_from_Device(...);/из нестанд.библиотеки/
until false;

Но нужно считывать данные только пока нажата определенная клавиша клавиатуры. Переделываю примерно так:(то что цикл проходит раз по любому - пренебречь, не суть)

repeat
 Read_From_Device(...);
 Application.ProcessMessages;
until flag;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if key=49 then flag:=false;
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if key=49 then flag:=true;
end;

Вот тут скорость опроса значительно падает, именно если держать клавишу нажатой. А если флаг включать,выключать просто кратковременными нажатиями на разные допустим клавиши - все замечательно.
Внимание вопрос.
Есть ли какие-нибудь пути обхода этой проблемы?


 
Alx2 ©   (2004-05-12 11:35) [1]

А если в отдельном потоке данные читать и делать ему из основного потока resume/suspend по нажатию кнопки?


 
Bel ©   (2004-05-12 11:53) [2]

Вызывай ProcessMessages не так часто, а, скажем, через каждые 200 итераций цикла.


 
evvcom ©   (2004-05-12 11:57) [3]

Причем частота 500 Гц соответствует периоду 2 мс. Постоянно в цикле читать - загрузка процессора 100%. Значит в доп.потоке надо сделать

procedure TMyThread.Execute;
begin
repeat
Read_from_Device(...); //из нестанд.библиотеки
Sleep(2);
until Terminated;
end;

Ну и управлять потоком, как сказал Alx2 ©   (12.05.04 11:35) [1]


 
rams   (2004-05-12 13:07) [4]

Спасибо.
Обязательно попробую оба варианта.


 
Mim1 ©   (2004-05-12 22:25) [5]

[2] Bel ©   (12.05.04 11:53)
Вызывай ProcessMessages не так часто, а, скажем, через каждые 200 итераций цикла.

Получится неравномерность считывания данных.


 
Morry ©   (2004-05-14 14:02) [6]

Я бы посоветовал построить так:

const THR_MSG_ENDTHREAD = WM_USER + 1;

hSignalEvent := CreateEvent(nil, True, False, nil);

procedure TMyThread.Execute;
var
 dwWaitRes:DWORD;
begin
repeat
 dwWaitRes := MsgWaitForMultipleObjects(1, hSignalEvent, False, INFINITE, QS_ALLEVENTS);
 case dwWaitRes of
   WAIT_OBJECT_0: Read_from_Device(...); //из нестанд.библиотеки
   WAIT_OBJECT_0 + 1: begin
    if PeekMessage(ThMsg, 0, THR_MSG_ENDTHREAD, THR_MSG_ENDTHREAD, PM_REMOVE) then Treminate;

   end;
 end;
until Terminated;
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=49 then SetEvent(hSignalEvent);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=49 then ResetEvent(hSignalEvent);
end;

procedure TerminateRequest;
begin
 PostThreadMessage(TMyThread.ThreadID, THR_MSG_ENDTHREAD, 0, 0);
end;


При таком коде минимальный отбор процессорного времени, гарантированное срабатываени опроса по скоросте близкое к realtime (на сколько это возможно под Win платформой).



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

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

Наверх




Память: 0.48 MB
Время: 0.031 c
7-1082307115
DK
2004-04-18 20:51
2004.05.30
подавить реакцию Windows на CTRL+ALT+DEL (в XP-ке)


14-1084524523
yzy
2004-05-14 12:48
2004.05.30
Как скрыть вводимые данные в консольном приложении?


3-1083653648
SergP
2004-05-04 10:54
2004.05.30
Как добавить поле с постоянным значением в результат запроса?


3-1084268110
titan83
2004-05-11 13:35
2004.05.30
Не получается использовать DBLookupComboBox


1-1084980494
dimon_programmer
2004-05-19 19:28
2004.05.30
Как правильно УНИЧТОЖИТЬ MDI-форму?