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

Вниз

Событие в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-51183
Andrey V.
2003-10-06 14:42
2003.10.16
Два проекта в одной папке


3-51082
Filat
2003-09-25 19:32
2003.10.16
FIBPlis под Delphi 7, не могу установить :(((


3-51095
Phenest
2003-09-25 17:03
2003.10.16
Проблема с Btrieve


6-51375
frost
2003-08-13 11:40
2003.10.16
Outlook and itc.


3-51113
Stas
2003-09-25 09:46
2003.10.16
Когда считывается информация из Blob полей ?