![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Событие в Com портах - как без тормоза своего приложения?
tipman © (2003-08-02 17:28:00)
Существует такая проблема - никак не могу отследить какое-то событие в Com порте в реальном времени без торможения моего приложения. Поковырявшись обнаружил такую функцию - WaitCommEvent которая возвращается по происшествии какого то события с Com, например отправка или приём сообщения, но когда нет никаких действий с Com"ом моя прога как бы зависает - ждёт когда венётмя WaitCommEvent. Пробовал эту функцию засунуть в отдельный поток т.е.
procedure ******.Execute()
begin
WaitCommEvent();
Syncronyze();
end;
всё получается наоборот - приложение зависает когда происходит какое-то событие в Com. Что я делаю неправильно? Может кто-то сталкивался с этой проблемой?
Evgeny V (2003-08-04 05:32:00) [1]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
tipman (2003-08-02 20:54:00) [2]
Для примера так стоит в моём потоке:
procedure edit_modify;
begin
Form1.Edit1.Text:="Засёк событие на Com1";
end;
procedure ******.Execute()
begin
WaitCommEvent();
Syncronyze(edit_modify);
end;
Verg (2003-08-02 17:33:00) [3]
> Syncronyze()
Syncronyze-то какого метода? Т.е. Что стоит в парамтерах?