![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки [D2005, XP]
авыф © (2007-06-05 12:06:00)здраствуйте! возник вопрос по потокам. а точнее по их приостановке и возобновление, просто тестировал как это работает, так вот когда создаешь 2 потока то все нормально, но когда в моем случае 4, то не работает все встает... объясните пожалуйста что я не так делаю? так как код на 5 юнитов, то залил архив исходников сюда http://slil.ru/24467941весит 17,315 байт... почему все встает не помойму. объясните пожалуйста как работать с большим количеством потоков...
авыф (2007-06-05 16:43:00) [1]
> Сергей М.
спасибо!
авыф (2007-06-05 16:42:00) [2]всё, разобрался, я просто некоторые потоки 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;
tesseract (2007-06-05 16:32:00) [3]
> возник вопрос а возможно ли узнать что сейчас какой-то поток
> приостановлен функцией Suspend?
Лог записывай, лог - при многопоточном приложении он сильно полезен.
Сергей М. (2007-06-05 16:31:00) [4]У твоих потоков есть св-во Suspended
Сергей М. (2007-06-05 16:29:00) [5]
> третий вс еравно не запускается
Как ты это определил средствами отладчика?
авыф (2007-06-05 16:29:00) [6]возник вопрос а возможно ли узнать что сейчас какой-то поток приостановлен функцией Suspend?
авыф (2007-06-05 15:28:00) [7]пользовался отладчиком, причем если пошагово нажать чтобы использовать третий поток, то запускаются сразу сразу 2 первых потока, третий вс еравно не запускается, вообщем я в шоке, не мог бы кто-нибудь скинуть пример как работать одновременно с 3 и более потоками, созданными тобой, ну т.е. чтоб можно их было останавливать и запускать?
Сергей М. (2007-06-05 15:18:00) [8]
> авыф (05.06.07 14:45) [5]
Воспользуйся встроенным отладчиком.
DVM (2007-06-05 15:04:00) [9]
> авыф (05.06.07 14:45) [5]
>
> > deadlock
>
> не нашел как ее использовать, не могли бы вы поподробнее
> про нее рассказать?
deadlock как раз использовать не надо :)))
Это ситуация взаимоблокировки потоков, когда они ждут друг друга и оба висят.
авыф (2007-06-05 14:45:00) [10]
> deadlock
не нашел как ее использовать, не могли бы вы поподробнее про нее рассказать?
> Сергей М.
сделал, но ситуация не изменилась...
Сергей М. (2007-06-05 12:37:00) [11]Для начала убери повышение приоритета до высочайшего.
Не трогай приоритет вообще - пусть он будет по-умолчанию, т.е. tpNormal
авыф (2007-06-05 12:28:00) [12]создаю поток так:
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;
вот если переключаться между двумя потоками то все работает как часы, но если переключиться на третий, то сразу все отрубается и ничего не работает, что я делаю не так?
Kolan (2007-06-05 12:21:00) [13]> как код на 5 юнитов
Выбири проблемные части и запость.
tesseract (2007-06-05 12:18:00) [14]
> объясните пожалуйста как работать с большим количеством
> потоков...
deadlock это называеться, смотри синхронизацию данных между потоками.