Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Вниз
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c