Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WaitCommEvent [D6, D7, Win2k]


ksa2002 ©   (2005-02-04 08:30:00) 

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

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


Erik1   (2005-02-04 11:42:00) [1]

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


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

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


Digitman   (2005-02-04 11:06:00) [3]


> 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.


Digitman   (2005-02-04 11:03:00) [4]

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

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


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


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


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


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

разве ?


Erik1   (2005-02-04 10:59:00) [6]

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


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

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


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

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 порту.Поключение.');


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


Digitman   (2005-02-04 10:18:00) [9]

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


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

ПОТОК

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 09:33:00) [11]

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


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

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


Digitman   (2005-02-04 09:04:00) [13]


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


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


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

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


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

вот код  потока
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


Digitman   (2005-02-04 08:41:00) [16]


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


должно ..

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо