Форум по 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 и пр) и сделать прием данных из порта по кнопке, то все работает. Т.е проблема именно с вторым потоком. Я думаю, что дело в том, что потоки начинают использовать один и тотже ресурс (переменную или функцию) и происходит коллизия в следствии чего зависают оба.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//--------------основной:
 
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, время: 10:31.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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