Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

потоки   Найти похожие ветки 

 
авыф   (2007-06-05 12:06) [0]

здраствуйте! возник вопрос по потокам. а точнее по их приостановке и возобновление, просто тестировал как это работает, так вот когда создаешь 2 потока то все нормально, но когда в моем случае 4, то не работает все встает... объясните пожалуйста что я не так делаю? так как код на 5 юнитов, то залил архив исходников сюда http://slil.ru/24467941 весит 17,315 байт... почему все встает не помойму. объясните пожалуйста как работать с большим количеством потоков...


 
tesseract ©   (2007-06-05 12:18) [1]


>  объясните пожалуйста как работать с большим количеством
> потоков...


deadlock это называеться, смотри синхронизацию данных между потоками.


 
Kolan ©   (2007-06-05 12:21) [2]

> как код на 5 юнитов

Выбири проблемные части и запость.


 
авыф   (2007-06-05 12:28) [3]

создаю поток так:
unit Unit2;

interface

uses
 Classes, windows, SysUtils;

type

 TThread1 = class(TThread)
 private
   j,k: integer;
 protected
   procedure Execute; override;
   procedure UpdateLog;              //Добавление записи в Memo
   procedure ThreadStart;            //Старт потока
   procedure ThreadStop;             //Завершение потока
 public
   constructor Create(i: integer);
 end;

implementation

uses unit1;

constructor TThread1.Create(i: integer);
begin
 inherited Create(True);     //Созданный поток создается в приостановленном состоянии
 FreeOnTerminate := True;    //Поток освободит ресурсы при окончании работы
 j:=i;
 k:=0;
 Self.Priority := tpHighest; //Очень высокий приоритет
end;

procedure TThread1.ThreadStart;
begin
 unit1.Form1.StatusBar1.Panels[1].Text := "поток запущен";
end;

procedure TThread1.ThreadStop;
begin
 unit1.Form1.StatusBar1.Panels[1].Text := "";
end;

procedure TThread1.UpdateLog;
begin
 unit1.Form1.Memo1.Lines.Add(IntToStr(k));
end;

procedure TThread1.Execute;
begin
 Synchronize(ThreadStart);               //Сообщение о старте потока

 try
//-- Цикл, пока для потока не будет выдана команда Terminate
   while not Terminated do begin
     Synchronize(UpdateLog); //Сообщаем об изменении
     Inc(k);
     sleep(j);
   end;
 finally
 end;
 Synchronize(ThreadStop);                     //Сообщаем о завершении потока
end;

end.

и так 4 юнита, различаются только названиями юнитов...
потом в главном окне объявляю так:
var
 Th1,Th2,Th3,Th4: TThread;

создаю потоки так:
Th1:=TThread1.Create(StrToInt(Edit1.Text));
 Th2:=TThread2.Create(StrToInt(Edit1.Text));
 Th3:=TThread3.Create(StrToInt(Edit1.Text));
 Th4:=TThread4.Create(StrToInt(Edit1.Text));

переключаюсь между потоками так:
case Form1.RadioGroup1.ItemIndex of
   0: begin
     Th2.Suspend;
     Th3.Suspend;
     Th4.Suspend;
     Th1.Resume;
   end;
   1: begin
     Th1.Suspend;
     Th3.Suspend;
     Th4.Suspend;
     Th2.Resume;
   end;
   2: begin
     Th1.Suspend;
     Th2.Suspend;
     Th4.Suspend;
     Th3.Resume;
   end;
   3: begin
     Th1.Suspend;
     Th2.Suspend;
     Th3.Suspend;
     Th4.Resume;
   end;
 end;

вот если переключаться между двумя потоками то все работает как часы, но если переключиться на третий, то сразу все отрубается и ничего не работает, что я делаю не так?


 
Сергей М. ©   (2007-06-05 12:37) [4]

Для начала убери повышение приоритета до высочайшего.
Не трогай приоритет вообще - пусть он будет по-умолчанию, т.е. tpNormal


 
авыф   (2007-06-05 14:45) [5]


> deadlock

не нашел как ее использовать, не могли бы вы поподробнее про нее рассказать?

> Сергей М.

сделал, но ситуация не изменилась...


 
DVM ©   (2007-06-05 15:04) [6]


> авыф   (05.06.07 14:45) [5]
>
> > deadlock
>
> не нашел как ее использовать, не могли бы вы поподробнее
> про нее рассказать?

deadlock как раз использовать не надо :)))

Это ситуация взаимоблокировки потоков, когда они ждут друг друга и оба висят.


 
Сергей М. ©   (2007-06-05 15:18) [7]


> авыф   (05.06.07 14:45) [5]


Воспользуйся встроенным отладчиком.


 
авыф   (2007-06-05 15:28) [8]

пользовался отладчиком, причем если пошагово нажать чтобы использовать третий поток, то запускаются сразу сразу 2 первых потока, третий вс еравно не запускается, вообщем я в шоке, не мог бы кто-нибудь скинуть пример как работать одновременно с 3 и более потоками, созданными тобой, ну т.е. чтоб можно их было останавливать и запускать?


 
Сергей М. ©   (2007-06-05 16:29) [9]


> третий вс еравно не запускается


Как ты это определил средствами отладчика ?


 
авыф   (2007-06-05 16:29) [10]

возник вопрос а возможно ли узнать что сейчас какой-то поток приостановлен функцией Suspend?


 
Сергей М. ©   (2007-06-05 16:31) [11]

У твоих потоков есть св-во Suspended


 
tesseract ©   (2007-06-05 16:32) [12]


> возник вопрос а возможно ли узнать что сейчас какой-то поток
> приостановлен функцией Suspend?


Лог записывай, лог - при многопоточном приложении он сильно полезен.


 
авыф   (2007-06-05 16:42) [13]

всё, разобрался, я просто некоторые потоки 2 раза подряд приостанавливал, и поэтому они не запускались, надо было так их менять:
case Form1.RadioGroup1.ItemIndex of
   0: begin
     if Th2.Suspended=false then Th2.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th1.Resume;
   end;
   1: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th2.Resume;
   end;
   2: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th2.Suspended=false then Th2.Suspend;
     if Th4.Suspended=false then Th4.Suspend;
     Th3.Resume;
   end;
   3: begin
     if Th1.Suspended=false then Th1.Suspend;
     if Th2.Suspended=false then Th2.Suspend;
     if Th3.Suspended=false then Th3.Suspend;
     Th4.Resume;
   end;
 end;


 
авыф   (2007-06-05 16:43) [14]


> Сергей М.

спасибо!



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
11-1164286342
Stan
2006-11-23 15:52
2007.07.01
Undeclared identifier Hint при добавлении компоненты


2-1181354671
Solbon
2007-06-09 06:04
2007.07.01
ftp


2-1181295060
webpauk
2007-06-08 13:31
2007.07.01
array of Timage


2-1181153421
framez
2007-06-06 22:10
2007.07.01
процессы


1-1178277873
I-New
2007-05-04 15:24
2007.07.01
32битная иконка на кнопке