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

Вниз

Завершение работы потока   Найти похожие ветки 

 
v_a_belousov   (2010-12-05 17:23) [0]

Здравствуйте! Понимаю что вопрос заезженный, но столкнулся с проблемой завершения работы потока...

Есть поток, который после выполнения должен сам себя уничтожить
FreeOnTerminate := true
В самом потоке есть цикл
while Play do
begin
//тело потока в котором есть ещё один цикл
...
while pause do
begin
if not Play then exit;
Application.ProcessMessages;
end;
...
end;

Поток должен уничтожаться при выходе из программы. Перед вызом Close главной формы пишу Play := false; что должно привести к завершению потока, но почему то после того как главная форма закрывается начинаются ужасные тормоза и лаги, несмотря на то что процессор не загружен абсолютно и память тоже свободна. Ошибок ни каких при этом не возникает. Иногда все закрывается нормально и никаких лагов и тормозов. В чем проблема не понимаю... Пробовал вручную завершать Terminate; Free; результат тот же... Подскажите пожалуйста с чем это может быть связано.


 
_Юрий   (2010-12-05 17:59) [1]


> Application.ProcessMessages;


Ни в коем случае.


 
v_a_belousov   (2010-12-05 18:07) [2]

А заменить на wait(10) например можно?


 
Anatoly Podgoretsky ©   (2010-12-05 18:54) [3]

Можно, а зачем?
Вопрос два - почему Terminated не используешь, а изобретаешь какой то Play

И вопрос три - а это кусок откуда?


 
Дмитрий С ©   (2010-12-05 18:55) [4]

на SwitchToThread заменить

А вообще лучше воспользоваться объектом ядра типа Event и функцией WaitForSingleObject


 
v_a_belousov   (2010-12-05 19:08) [5]


> Можно, а зачем?

Чтобы ждать снятия с паузы

> Вопрос два - почему Terminated не используешь, а изобретаешь
> какой то Play

Да правильно наверно while not Terminated do а почему Play сделал не помню уже честно говоря

> И вопрос три - а это кусок откуда?

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

> Дмитрий С

Спасибо


 
Anatoly Podgoretsky ©   (2010-12-05 19:12) [6]

> v_a_belousov  (05.12.2010 19:08:05)  [5]

Я спрашивал, как процедура называется, как она стыкуется с Execute


 
v_a_belousov   (2010-12-05 19:16) [7]

Это изнутри самого Execute...

procedure TSnakeEngline.Execute;
var i, sL, sT, asL, asT: integer;
begin
        //пока играем поток не завершается
             while Play do begin
       // ------------------------------ ЦИКЛ ИГРЫ

//если на паузе то ждем
while pause do begin
if not Play then begin {Terminate; Free;} exit; end;
sleep(10); end;
//устанавливаем скорость
Speed := 300-15*CurrentLevel;
//соблюдаем скорость
sleep(speed);
//если сняли с паузы, то выбираем куда идти
case SnakeMove of
//налево
MoveLeft:
begin
 //движемся влево
 CurrentMove := MoveLeft;
 for i:=0 to Length(SnakeParts)-1 do
  begin
   if i>1 then
    begin
     sL := asL;
     sT := asT;
    end;
   if i=0 then
    begin
     sL := SnakeParts[i].Left;
     sT := SnakeParts[i].Top;
     SnakeParts[i].Left := SnakeParts[i].Left-16;
    end else
    begin
     asL := SnakeParts[i].Left;
     asT := SnakeParts[i].Top;
     SnakeParts[i].Left := sL;
     SnakeParts[i].Top := sT;
    end;
  end;
end;
//направо
MoveRight:
begin
 //движемся вправо
 CurrentMove := MoveRight;
 for i:=0 to Length(SnakeParts)-1 do
  begin
   if i>1 then
    begin
     sL := asL;
     sT := asT;
    end;
   if i=0 then
    begin
     sL := SnakeParts[i].Left;
     sT := SnakeParts[i].Top;
     SnakeParts[i].Left := SnakeParts[i].Left+16;
    end else
    begin
     asL := SnakeParts[i].Left;
     asT := SnakeParts[i].Top;
     SnakeParts[i].Left := sL;
     SnakeParts[i].Top := sT;
    end;
  end;
end;
//вверх
MoveTop:
begin
 //движемся вверх
 CurrentMove := MoveTop;
 for i:=0 to Length(SnakeParts)-1 do
  begin
   if i>1 then
    begin
     sL := asL;
     sT := asT;
    end;
   if i=0 then
    begin
     sL := SnakeParts[i].Left;
     sT := SnakeParts[i].Top;
     SnakeParts[i].Top := SnakeParts[i].Top-16;
    end else
    begin
     asL := SnakeParts[i].Left;
     asT := SnakeParts[i].Top;
     SnakeParts[i].Left := sL;
     SnakeParts[i].Top := sT;
    end;
  end;
end;
//вниз
MoveBottom:
begin
 //движемся вниз
 CurrentMove := MoveBottom;  
 for i:=0 to Length(SnakeParts)-1 do
  begin
   if i>1 then
    begin
     sL := asL;
     sT := asT;
    end;
   if i=0 then
    begin
     sL := SnakeParts[i].Left;
     sT := SnakeParts[i].Top;
     SnakeParts[i].Top := SnakeParts[i].Top+16;
    end else
    begin
     asL := SnakeParts[i].Left;
     asT := SnakeParts[i].Top;
     SnakeParts[i].Left := sL;
     SnakeParts[i].Top := sT;
    end;
  end;
end;
end;
//обновляем форму
//Synchronize(SnakeForm.Refresh);
SnakeForm.Refresh;
// проверяем  не  столкнулись ли со стеной  или с самим собой
Synchronize(CheckConflict); //если да то сообщаем о проигрыше
if Conflict then begin pause:=true; MsgText:="Вы проиграли"; Synchronize(ShowMsg) end;
// проверяем съели ли мы что то
Synchronize(CheckPartake);
if Partake then begin Partake := false; MoveApple; AddPartToSnake;
//добавив часть змейке и переместив яблоко увеличиваем счет
inc(PartakeCount); GameInfoForm.PartakeCount_L.Caption := "Съедено яблок: " +
IntToStr(PartakeCount); Score := CalcScores;
//выводи информацию о кол-ве очков и текущем уровне
GameInfoForm.ScoreCount_L.Caption := "Набрано очков: " + IntToStr(Score);
GameInfoForm.CurrentLevel_L.Caption := "Текущий уровень: " + IntToStr(CurrentLevel);
end;
//  ---------------------- ЦИКЛ ИГРЫ ---------------------------
end;
end;


 
Anatoly Podgoretsky ©   (2010-12-05 19:33) [8]

Если флаг сброшен, то выход должен быть немедленным.


 
Сергей М. ©   (2010-12-05 19:39) [9]


> v_a_belousov   (05.12.10 19:16) [7]


Ве это чудесно, но чем тогда таким архисложным у тебя занят осн.поток, если практически вся и игровая функциональность сосредоточена в дополнительном ?


 
Ega23 ©   (2010-12-05 19:45) [10]

Зачем тут вообще дополнительный поток?


 
v_a_belousov   (2010-12-05 19:52) [11]


> Если флаг сброшен, то выход должен быть немедленным.
>

Так оно и есть но иногда что то не то происходит... точнее происходило пока не убрал Application.ProcessMessages;

> Ве это чудесно, но чем тогда таким архисложным у тебя занят
> осн.поток, если практически вся и игровая функциональность
> сосредоточена в дополнительном ?


> Зачем тут вообще дополнительный поток?

Занимается чем и должен проигрыванием музыки, видео, показом изображений... Я писал для себя небольшой плеер и захотел в него что нибудь добавить необычное... так вот сделал что при нажатии определенной комбинации клавиш в плеере можно поиграть в змейку)


 
Игорь Шевченко ©   (2010-12-05 21:23) [12]


> так вот сделал что при нажатии определенной комбинации клавиш
> в плеере можно поиграть в змейку


А при нажатии другой комбинации клавиш форматнуть винт. В фоне.


 
v_a_belousov   (2010-12-05 21:40) [13]


> А при нажатии другой комбинации клавиш форматнуть винт

зачем же так злобно то?)


 
Игорь Шевченко ©   (2010-12-05 21:45) [14]


> зачем же так злобно то?)


да нет, ничего злобного в виду не имелось. Просто для игрушек (и для форматирования винта) есть уже готовые приложения, вроде программы на Delphi не в однозадачной среде выполняются, для подобных извратов...


 
v_a_belousov   (2010-12-05 22:47) [15]


> росто для игрушек (и для форматирования винта) есть уже
> готовые приложения, вроде программы на Delphi не в однозадачной
> среде выполняются, для подобных извратов...

не знаю что имеется ввиду, но я же никого не прошу пользоваться своим плеером например. я пишу его для себя, а мини игры(или шутки какие-то) в свои приложения многие вставляют...


 
Ega23 ©   (2010-12-05 22:55) [16]


> а мини игры(или шутки какие-то) в свои приложения многие
> вставляют...


Почему её нельзя отдельным процессом сделать, а нужно вот так вот извращаться - я не совсем понимаю.


 
v_a_belousov   (2010-12-05 23:33) [17]


> Почему её нельзя отдельным процессом сделать, а нужно вот
> так вот извращаться - я не совсем понимаю.

Может потому что я ещё начинающий...



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

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

Наверх




Память: 0.52 MB
Время: 0.01 c
2-1291741116
stas
2010-12-07 19:58
2011.02.27
повторный запуск TThread


15-1289990564
alexdn_
2010-11-17 13:42
2011.02.27
Майкрософт, конференция, платформа 2011


15-1289921196
Делфиец
2010-11-16 18:26
2011.02.27
как соединить два компьютера через 3G модемы


2-1291800746
cross
2010-12-08 12:32
2011.02.27
Доступ к списку (private) класса TA из класса TB содержащего TA


2-1290929948
SIV5000
2010-11-28 10:39
2011.02.27
IShellFolder и диалог свойства файлов