Добрый день форумчане. Обращаюсь к вас вопросом..
Дано:
2 потока. 1 основной и 1 дополнительный.
основной ждет нажатия кнопки "отправить".
вспомогательный постоянно мониторит порт на наличие инфы.
вопрос:
у меня возникает зависание потоков, когда вспомогательный поток начинает мониторить порт! В чет проблема, кто подскажет?
замечание:
если убрать поток и мониторинг порта (WaitCommEvent и пр) и сделать прием данных из порта по кнопке, то все работает. Т.е проблема именно с вторым потоком. Я думаю, что дело в том, что потоки начинают использовать один и тотже ресурс (переменную или функцию) и происходит коллизия в следствии чего зависают оба.
Код:
//--------------основной:
procedure Tmain.Button2Click(Sender: TObject);
var
...
begin
...
if (send_str(main,str) <> 0) then
begin
Memo2.Text:= Memo2.Text + edit1.Text;
Memo2.Lines.Add('');
end;
end;
end;
//--------------основной:
//--------------вспомогательный:
procedure class_monitor.Execute;
var
ee:dword;
i:integer;
begin
while True do
begin
sleep(100);
cs3.Enter;
event := tevent.create(nil, false, false, '');
if WaitCommEvent(hcom, ee, @o) = NULL then
cs3.Leave;
begin
i := (Read_Device(hCOM, o, Length(Input_Buffer), Input_Buffer));
if (i <> 0) then begin
Application.MessageBox('Ошибка чтения порта', 'Ошибка', MB_OK);
end;
//s:=decode_str;
cs1.Enter;
main.memo1.Text := main.memo1.Text+decode_str();
main.memo1.Lines.Add('');
cs1.Leave;
event.setevent;
end;
end;
end;
//--------------вспомогательный:
//---------------функции
function send_str(Sender: TObject;str:ansistring):integer;
var
i,j:integer;
s,ss:ansistring;
begin
ss:=dopolnenie(str);
ss:=coder_mes(main,ss);
event.waitfor(12);
result := Write_Device(hCOM, o, Output_Buffer, Length(Output_Buffer));
if (result <> 0) then begin
Application.MessageBox('Ошибка записи в порт', 'Ошибка', MB_OK);
...
end;
...
end;
function Write_Device(handle: cardinal; o: TOverlapped; Buffer: TIO_Buffer;
Byte_Number: integer): integer;
var
Byte_Count2: cardinal;
fSuccess: boolean;
Event: DWORD;
begin
fSuccess := SetCommMask(handle, (EV_BREAK or EV_ERR or EV_TXEMPTY));
if fSuccess = false then
begin
Write_Device := -1;
Exit;
end;
fSuccess := WriteFile(handle, Buffer, Byte_Number, Byte_Count2, nil);
if fSuccess = false then begin
Write_Device := -2;
Exit;
end;
fSuccess := WaitCommEvent(handle, Event, @o);
if (fSuccess = true) and ((Event and EV_BREAK) = EV_BREAK) then begin
Write_Device := 0;
exit;
end;
if (fSuccess = true) and ((Event and EV_ERR) = EV_ERR) then begin
Write_Device := -4;
exit;
end;
if (fSuccess = true) and ((Event and EV_TXEMPTY) = EV_TXEMPTY) then begin
Write_Device := 0;
end
else
Write_Device := -5;
end;
//---------------функции