Форум: "Система";
Текущий архив: 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