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

Вниз

WaitCommEvent   Найти похожие ветки 

 
ksa2002   (2005-02-04 08:30) [0]

Использую чтение из COM порта в отдельном потоке
установил маску ожидания .
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);

так вот при запуске потока он начинает использовать процесоор на 100 % разве  WaitCommEvent не дожно приостнавливать  до тех пор пока не произойдёт событие?


 
Digitman ©   (2005-02-04 08:41) [1]


> разве  WaitCommEvent не дожно приостнавливать  до тех пор
> пока не произойдёт событие?


должно ..

ошибка у тебя скорей всего где-то в другом месте программы. а не в точке вызова WaitCommEvent


 
ksa2002   (2005-02-04 08:45) [2]

вот код  потока
repeat
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);
ClearCommError(Com, e5, @ComStat);

if (ComStat.cbInQue>0) then
for t:=1 to ComStat.cbInQue do
begin
ReadFile(Com, s1,1, dwRead, nil);
form1.memo1.Text:=form1.memo1.Text+s1;
end;

until Terminated


 
ksa2002   (2005-02-04 09:00) [3]

т.е. я хотел приостоновить процесс пока нет данных или это надо делать непосредсвтенно остновливая поток  ?


 
Digitman ©   (2005-02-04 09:04) [4]


> form1.memo1.Text:=form1.memo1.Text+s1;


кто дал тебе право обращаться к VCL-объектам в доп.потоке ?


 
ksa2002   (2005-02-04 09:12) [5]

Ладно синхронизирую я это и вытяну через глобальную переменную,
закоментировал ...поток всеравно есть все свободные ресурсы


 
Digitman ©   (2005-02-04 09:33) [6]

приведи полный код поточного класса и фрагмент кода, где ты создаешь поточный объект


 
ksa2002   (2005-02-04 09:40) [7]

ПОТОК

unit out_com_port;

interface

uses
 Windows, Classes;

type
 out_com_port = class(TThread)
 private

 protected
   procedure Execute; override;
 end;

implementation
uses Unit1;

procedure out_com_port.Execute;
var
e5:dword;
s1:char;
t,TransMask:dword;
begin
repeat
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);
ClearCommError(Com, e5, @ComStat);
if (ComStat.cbInQue>0) then
for t:=1 to ComStat.cbInQue do
begin
ReadFile(Com, s1,1, dwRead, nil);
end;
until Terminated
end;
end.


ВЫЗОВ ПОТОКА

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked then
 begin
  out_com_port := Tout_com_port.Create( True );
  out_com_port.FreeOnTerminate := True;
  out_com_port.Priority := tpLower;
  out_com_port.Resume;

 end
else
 begin
  if Assigned( out_com_port ) then out_com_port.Terminate;
 end;

end;


 
Digitman ©   (2005-02-04 10:18) [8]

где и как объявлена переменная Com ?
как и в какой момент она инициализируется ?


 
ksa2002   (2005-02-04 10:31) [9]

com:THandle;

Com := CreateFile(Pchar(scom1),GENERIC_READ+GENERIC_write,0,nil,
                  OPEN_EXISTING,0,0);
    ovr.hEvent:=CreateEvent(nil,FALSE,FALSE,nil);
try
Succes:=GetCommState(Com, dcb);
SetCommMask(Com,EV_RXCHAR);
dcb.BaudRate :=scom2;
dcb.ByteSize := scom3;
dcb.Parity := NOparity;
dcb.StopBits := onestopbit;
Succes:=SetCommState(Com, dcb);
GetCommTimeouts(com,timeout);
timeout.ReadIntervalTimeout:=50;
timeout.ReadTotalTimeoutMultiplier:=20;
timeout.ReadTotalTimeoutConstant:=300;
timeout.writetotalTimeoutMultiplier:=100;
timeout.writeTotalTimeoutConstant:=1000;
SetCommTimeouts(com,timeout);
purgeComm(com,purge_txclear or purge_rxclear or purge_txabort or purge_rxabort);
except
showmessage("Ошибка доступа к COM порту.Поключение.");


Всё работает ...мне только интресно было приостоновить процесс ... пока нет данных в порте


 
Erik1 ©   (2005-02-04 10:55) [10]

Не маялся бы ты дурью, возми готовый компонент и пользуйся им. Если хочеш свой написать посмотри хотябы код VARIAN ASYNC32 v1.48 FreeWare. Ты же неиспользуеш FILE_FLAG_OVERLAPPED, тогда почнму должен работать WaitCommEvent?


 
Erik1 ©   (2005-02-04 10:59) [11]

Вот очень хорошая сылка, по com портам.
http://www.skvozilka.com.ru/delphi/components/HardWare_port.shtml


 
Digitman ©   (2005-02-04 11:03) [12]

т.е. Сom у тебя - глоб.переменная в модуле Unit1, и код [9] успешно исполняется ДО того как ты стартуешь поток ?

а зачем тебе ovr-переменная и ивент ? ты же не используешь overlapped-режим ?


> мне только интресно было приостоновить процесс


и что ? не приостанавливается ? будучи вызванной WaitCommEvent тут же возвращает управление ? и каков же результат выполнения функции (!!) WaitCommEvent ? True ? False ? если False, то о чем говорит GetLastError ?


 
ksa2002   (2005-02-04 11:03) [13]


> Ты же неиспользуеш FILE_FLAG_OVERLAPPED,
> тогда почнму должен работать WaitCommEvent?

разве ?


 
Digitman ©   (2005-02-04 11:06) [14]


> Erik1 ©   (04.02.05 10:55) [10]


> Ты же неиспользуеш FILE_FLAG_OVERLAPPED, тогда почнму должен
> работать WaitCommEvent?


тут ты не прав..

ф-ция может работать и без оверлэп-режима.

lpOverlapped

Points to an OVERLAPPED structure. This structure is required if hFile was opened with FILE_FLAG_OVERLAPPED.

это условие соблюдено.

If hFile handle was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.


 
ksa2002   (2005-02-04 11:13) [15]

> Digitman ©   (04.02.05 11:03) [12]
Код выполняеться нормально
Но я думал что WaitCommEvent будет приостновливать поток до наступления события , чтобы тот не занемал процессор.
Ovr есть потомучто я пробывал OVERLAPPED , но тоже самое.


 
Erik1 ©   (2005-02-04 11:42) [16]

Да согласен нсчет OVERLAPPED. Просто мне кажется, что WaitCommEvent неимеет в таком режиме смысла. Постольку ReadFile прекрасно останавливает выполнение кода, а если нехочется нагружать процесор то лучше воспользоватся OVERLAPPED. Для этого надо посмотреть примеры.



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

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
14-1109590687
AlexG
2005-02-28 14:38
2005.03.20
Какую машину покупать?


1-1109843862
e-mike
2005-03-03 12:57
2005.03.20
TExcelApplication - OLE error 800A03EC.


4-1107344404
Serx
2005-02-02 14:40
2005.03.20
Кнопка Пуск


4-1107699954
Agent-Smith
2005-02-06 17:25
2005.03.20
Драйвер PC/SC


1-1109919297
Fktrc
2005-03-04 09:54
2005.03.20
Исключение в деструкторе треда при попытке протрассировать его