Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
авыф (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c