Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.11.2010, 22:54
denis_kas denis_kas вне форума
Прохожий
 
Регистрация: 24.11.2010
Сообщения: 1
Репутация: 10
По умолчанию Коллизии потоков

Добрый день форумчане. Обращаюсь к вас вопросом..
Дано:
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;

//---------------функции
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025