![]() |
|
#1
|
|||
|
|||
![]() Добрый день форумчане. Обращаюсь к вас вопросом..
Дано: 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; //---------------функции |