Главная страница
    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.009 c
6-51381
Boutenko_Ivan
2003-08-19 18:25
2003.10.16
вопрос, работа с почтой


1-51198
zumo
2003-10-04 08:55
2003.10.16
2 вопроса


14-51437
Некрофил-затейник__
2003-09-30 07:30
2003.10.16
HELP!!!!!


8-51350
WhiteSnow
2003-06-12 12:43
2003.10.16
Ещё раз про MP3


3-51076
AlexanderSK
2003-09-25 14:36
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский