Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c