Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
6-1082019158
Ozone
2004-04-15 12:52
2004.05.30
TIdTCPServer


7-1082498725
Demi
2004-04-21 02:05
2004.05.30
Как вырубить прогу, если её нет в Диспетчере задач.


1-1084536486
Kest
2004-05-14 16:08
2004.05.30
Проблема записи из одного TMemoryStream в другой


3-1084352586
}|{yk
2004-05-12 13:03
2004.05.30
Как програмно поменять юзера в IBase


1-1084817359
Damager
2004-05-17 22:09
2004.05.30
Пауза в процедуре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский