Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2009, 15:34   #1
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
Печаль Thread.Приложение не отвечает. Не запускается поток.

Здравствуйте. У меня появилась проблема, которую пока что не знаю как решить. У меня такое задание: заполнение пирамидок кольцами определенного цвета. По нажатию на кнопку "старт" должен запускаться поток, реализующий определенные операции по заполнению. Но приложение виснет, и метод work потока не выполняется. Пожалуйста, помогите.
Заглавная форма
Код:
...
procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.Caption='Старт' then begin
button1.Caption:='Стоп';
boo:=true;
nt:=tmythread.Create(true);
nt.FreeOnTerminate:=true;
nt.priority:=tpNormal;
nt.Resume;
end
else begin nt.Suspend;
nt.Terminate;
nt.Free;
nt:=nil;
button1.Caption:='Старт';
end;end;....
Поток
Код:
procedure TMyThread.Execute;
begin
synchronize(start); 
  while (not terminated) do
  synchronize(work);
end;

procedure TMyThread.Start;
var k,j,l:byte;  name:string[10];
begin
kolvo:=10;
if not vruch then begin {это парамет отвечает за настройки, заданные   автоматически}
randomize;
for j:=1 to kolvo do begin
  k:=random(11);          {выбор случ образом начального кол-ва колец на каждой пирамидке}
for l:=0 to color_num do    {задание цвета колец из настроек}
  if colorconst[l]=usedcol[j] then name:=colornames[l];
//параметры каждой пирамидки
pir[j].number:=j; //номер
pir[j].kolca:=k;   //кол-во колец
pir[j].col:=usedcol[j];  //цвет колец
pir[j].name:=name;    //название цвета
png.LoadFromFile('img\'+name+'\'+inttostr(k)+name+'.png');
case j of
1:  form1.image1.Canvas.Draw(0,0,png);
...
10: form1.image10.Canvas.Draw(0,0,png);
end; end; end
else begin           //если параметры заданы вручную
 for j:=1 to kolvo do begin
for l:=0 to color_num do
  if colorconst[l]=usedcol[j] then name:=colornames[l];
pir[j].number:=j;
pir[j].col:=usedcol[j];
pir[j].name:=name;
png.LoadFromFile('img\'+name+'\'+inttostr(pir[j].kolca)+name+'.png');
case j of
1: form1.image1.Canvas.Draw(0,0,png);
...
10:form1.image10.Canvas.Draw(0,0,png);
end; end;
end;
end;

procedure TMyThread.Work;
var k,l,j,z,y,a:byte; done:boolean;  av:array[1..10] of byte;
begin
randomize;
k:=random(kolvo);  //случ. образом выбир-ся цвет для заполнения пирамидки
form1.shape2.Brush.Color:=usedcol[k]; 
j:=1; while j<=kolvo do begin
  if pir[j].col=form1.shape2.Brush.Color then begin
    inc(pir[j].kolca);  //колцо надевается
    png.LoadFromFile('img\'+pir[j].name+'\'+inttostr(pir[j].kolca)+pir[j].name+'.png');
   full[j]:=j; //массив пирамидок, где есть хотя бы одно кольцо
empty[j]:=0;  //массив пустых пирамидок
          case pir[j].number of
1:form1.image1.Canvas.Draw(0,0,png);
...
10:form1.image10.Canvas.Draw(0,0,png); 
end;
    if pir[j].kolca=12 then begin   //если кольцо 12ое, то пирамидка удаляется с экрана и размерность массивов изменяется
      for l:=j+1 to kolvo do begin
        usedcol[l-1]:=usedcol[l];
        pir[l-1]:=pir[l];
        full[l-1]:=full[l];
        empty[l-1]:=empty[l];
      end;
      kolvo:=kolvo-1;
      case pir[j].number of
        1: form1.image1.Visible:=false;
     ...
        10:form1.image10.Visible:=false;
        end;  j:=kolvo+1; end
else inc(j);
    end;
//аварийная ситуация. цвет аварийной лампочки совпадает с каким-нибудь цветом непустых пирамидок и пирамидка очищается от колец
if i=ver then begin  done:=false;
y:=1; for a:=1 to kolvo do if full[a]<>0 then begin av[y]:=a; inc(y); done:=true; end;
 randomize;
 if done then begin z:=av[random(y-1)+1]; //в массив av заносятся ненулевые значения из full
 form1.Shape1.Brush.Color:=usedcol[z];
form1.shape1.Visible:=true;  end;
  i:=0; k:=random(40); if k<>0 then ver:=avaria[k] else ver:=avaria[1];
 end
else inc(i);
 sleep(500);

if form1.shape1.Visible then begin
      png.LoadFromFile('img\'+pir[z].name+'\0'+pir[z].name+'.png');
      case pir[z].number of
1:form1.image1.Canvas.Draw(0,0,png); 
2:form1.image2.Canvas.Draw(0,0,png);  
...
10:form1.image10.Canvas.Draw(0,0,png); 
end;
     pir[z].kolca:=0;     full[z]:=0; empty[z]:=z;
      end;
    form1.shape1.Visible:=false;

end;
end;
end.
Zerofill вне форума Ответить с цитированием
Старый 10.10.2009, 15:48   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Выкладывайте проект.
И задачу поточнее бы.
Нужно сделать из колец, заданного радиуса, пирамиду? Или что вообще за пирамидки?
TwiX вне форума Ответить с цитированием
Старый 10.10.2009, 16:04   #3
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
По умолчанию


проблема частично решена. просто при автоматическом задании параметров пирамидок у меня не инициализировались массивы full и empty
Прошу прощения
Но все равно спасибо за то, что не прошли мимо.

Последний раз редактировалось Zerofill; 10.10.2009 в 16:06.
Zerofill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Thread Arnezami Общие вопросы .NET 2 04.10.2009 22:08
Не запускается на других компах приложение. evgenrpo Общие вопросы C/C++ 2 04.06.2009 00:36
на компьютере нет Delphi, приложение не запускается, выдает ошибку - не является приложением Win32 Vadim_Haritonov Общие вопросы Delphi 3 30.10.2008 12:23
Запрос к БД в отдельном потоке (Thread) tyrell lab БД в Delphi 1 14.06.2007 08:42
Приложение для БД не запускается на компьютере, где не установлен Delphi OlegTS БД в Delphi 3 17.05.2007 04:33