Главная страница
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.012 c
2-1291739016
Ux
2010-12-07 19:23
2011.02.27
Ошибка 11004


2-1290769217
dm
2010-11-26 14:00
2011.02.27
изменение ip адреса шлюза и пр


11-1231103049
haword
2009-01-05 00:04
2011.02.27
Lazarus + MCK KOL + WinCE


2-1291296114
privet123
2010-12-02 16:21
2011.02.27
Способ прочитать с диска - правильно так?


15-1289927971
Пит
2010-11-16 20:19
2011.02.27
Изменение FormStyle в кострукторе формы