Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Вниз

Событие в Com портах - как без тормоза своего приложения?   Найти похожие ветки 

 
tipman   (2003-08-02 17:28) [0]

Существует такая проблема - никак не могу отследить какое-то событие в Com порте в реальном времени без торможения моего приложения. Поковырявшись обнаружил такую функцию - WaitCommEvent которая возвращается по происшествии какого то события с Com, например отправка или приём сообщения, но когда нет никаких действий с Com"ом моя прога как бы зависает - ждёт когда венётмя WaitCommEvent. Пробовал эту функцию засунуть в отдельный поток т.е.

procedure ******.Execute()
begin
WaitCommEvent();
Syncronyze();
end;

всё получается наоборот - приложение зависает когда происходит какое-то событие в Com. Что я делаю неправильно? Может кто-то сталкивался с этой проблемой?


 
Verg   (2003-08-02 17:33) [1]


> Syncronyze()

Syncronyze-то какого метода? Т.е. Что стоит в парамтерах?


 
tipman   (2003-08-02 20:54) [2]

Для примера так стоит в моём потоке:


procedure edit_modify;
begin
Form1.Edit1.Text:="Засёк событие на Com1";
end;


procedure ******.Execute()
begin
WaitCommEvent();
Syncronyze(edit_modify);
end;


 
Evgeny V   (2003-08-04 05:32) [3]

void __fastcall MyCom::Execute()
{
//---- Place thread code here ----
DWORD Signaled,ByteTrans,TErr;
HANDLE EventHandles[2];
EventHandles[0]=FStop;
EventHandles[1]=osWait.hEvent;
while (!Terminated)
{
FMask=0;
osWait.Offset=0;
osWait.OffsetHigh=0;
WaitCommEvent(FComPort, &FMask, &osWait);
Signaled = WaitForMultipleObjects(2, EventHandles, false, INFINITE);
switch (Signaled)
{
case WAIT_OBJECT_0:
ResetEvent(FStop);
Terminate();
break;
case WAIT_OBJECT_0+1:
if (GetOverlappedResult(FComPort, &osWait, &ByteTrans, false))
{
ResetEvent(osWait.hEvent);
EnterCriticalSection(&MyDef);
if (FMask & EV_RXCHAR)
EvComm.EvRx=true;
if (FMask & EV_TXEMPTY)
EvComm.EvTx=true;
EvComm.EvErr=false;
if (FMask & EV_DSR)
EvComm.EvErr=!CheckModem();
SetEvent(FEvent);
LeaveCriticalSection(&MyDef);
break;
}//end if
case WAIT_FAILED:
TErr=GetLastError();
//ClearCommError(FComPort,&TErr,&ComStat);
ResetEvent(osWait.hEvent);
EnterCriticalSection(&MyDef);
EvComm.EvErr=true;
SetEvent(FEvent);
LeaveCriticalSection(&MyDef);
break;
}// end switch
}// end While
( в нее и ложил инфо -что произошло на порту) void __fastcall MyCom::Execute()
{
//---- Place thread code here ----
DWORD Signaled,ByteTrans,TErr;
HANDLE EventHandles[2];
EventHandles[0]=FStop;
EventHandles[1]=osWait.hEvent;
while (!Terminated)
{
FMask=0;
osWait.Offset=0;
osWait.OffsetHigh=0;
WaitCommEvent(FComPort, &FMask, &osWait);
Signaled = WaitForMultipleObjects(2, EventHandles, false, INFINITE);
switch (Signaled)
{
case WAIT_OBJECT_0:
ResetEvent(FStop);
Terminate();
break;
case WAIT_OBJECT_0+1:
if (GetOverlappedResult(FComPort, &osWait, &ByteTrans, false))
{
ResetEvent(osWait.hEvent);
EnterCriticalSection(&MyDef);
if (FMask & EV_RXCHAR)
EvComm.EvRx=true;
if (FMask & EV_TXEMPTY)
EvComm.EvTx=true;
EvComm.EvErr=false;
if (FMask & EV_DSR)
EvComm.EvErr=!CheckModem();
SetEvent(FEvent);
LeaveCriticalSection(&MyDef);
break;
}//end if
case WAIT_FAILED:
TErr=GetLastError();
//ClearCommError(FComPort,&TErr,&ComStat);
ResetEvent(osWait.hEvent);
EnterCriticalSection(&MyDef);
EvComm.EvErr=true;
SetEvent(FEvent);
LeaveCriticalSection(&MyDef);
break;
}// end switch
}// end While
Connected=false;
}//end Execute
Кусок кода, FEvent у меня сигналил другому потоку, где уже проверялась структура EvComm(в нее и ложил инфо -что произошло на порту), если этого не надо можешь вызвать Syncronyze, но я обычно в главную форму послыю сообщение PostMessage



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

Форум: "Система";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.01 c
1-51244
uu
2003-10-03 15:27
2003.10.16
string


3-51062
sapsi
2003-09-26 10:52
2003.10.16
Использование виртуальной таблицы


14-51509
ИМХО
2003-09-26 23:55
2003.10.16
На сотовый!


1-51262
real_dimedrol
2003-10-07 01:01
2003.10.16
Вопросы по MDI Application


1-51340
Fast
2003-10-05 22:30
2003.10.16
Получить список всех кнопок на форме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский