Зависание проги, генерирующей случайные числа.

werwolf_ua
Дата: 25.05.2011 14:28:37
Доброе время суток, господа. Мой приятель написал прогу, генерирующую случайные числа, вот её текст.
 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, InIFiles, Menus, jpeg, Gauges, Spin;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Options: TMenuItem;
    GroupBox1: TGroupBox;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    LabeledEdit5: TLabeledEdit;
    LabeledEdit6: TLabeledEdit;
    LabeledEdit7: TLabeledEdit;
    LabeledEdit8: TLabeledEdit;
    LabeledEdit9: TLabeledEdit;
    LabeledEdit10: TLabeledEdit;
    LabeledEdit11: TLabeledEdit;
    LabeledEdit12: TLabeledEdit;
    Button1: TButton;
    Button2: TButton;
    LabeledEdit13: TLabeledEdit;
    Memo1: TMemo;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    LabeledEdit14: TLabeledEdit;
    Button4: TButton;
    Label1: TLabel;
    Image6: TImage;
    Image7: TImage;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Timer1: TTimer;
    Memo2: TMemo;
    SpinEdit1: TSpinEdit;
    Label9: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure OptionsClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    procedure AB00(var Message); message $AB00;
  public
    { Public declarations }
  end;

  type
  TPoint = packed record
    X, Y, Z, R, Phi: Double;
  end;

const
  NumStars = 2000; // Êîëè÷åñòâî çâ¸çä,
  // óïðàâëÿåò îáùåé ïëîòíîñòüþ çâ¸çäíîãî ïîëÿ
  {
  RangeY = 7000; // Ìàêñèìàëüíîå ðàññòîÿíèå îò êàðòèííîé ïëîñêîñòè äî çâåçäû,
  // óïðàâëÿåò ïëîòíîñòüþ çâ¸çä â öåíòðå

  RangeR = 7000; // Ìàêñèìàëüíîå ðàäèàëüíîå óäàëåíèå îò ëó÷à çðåíèÿ äî çâåçäû,
  // óïðàâëÿåò ïëîòíîñòüþ çâ¸çä ïî êðàÿì

  Height = 5000; // Âûñîòà íàáëþäàòåëÿ,
  // óïðàâëÿåò ïîëîæåíèåì öåíòðà èçîáðàæåíèÿ ïî âåðòèêàëè

  Basis = 100; // Ðàññòîÿíèå äî êàðòèííîé ïëîñêîñòè
  // óïðàâëÿåò ñîîòíîøåíèåì êîëè÷åñòâà çâ¸çä â öåíòðå ê èõ
  // êîëè÷åñòâó ïî êðàÿì

  DeltaY = 2; // Øàã èçìåíåíèÿ êîîðäèíàòû, óïðàâëÿåò ñêîðîñòüþ äâèæåíèÿ
  DeltaT = 0.01; // Ïðèðàùåíèå âðåìåíè, óïðàâëÿåò ñêîðîñòüþ âðàùåíèÿ
  Period1 = 0.1; // Ïåðèîä âðàùåíèÿ çâ¸çä
  Amplitude2 = 0.15; // Àìïëèòóäà âðàùàòåëüíûõ êîëåáàíèé çâ¸çä
  Period2 = 0.8; // Ïåðèîä âðàùàòåëüíûõ êîëåáàíèé
  Period3 = 0.2; // Ïåðèîä èçìåíåíèÿ íàïðàâëåíèÿ äâèæåíèÿ çâ¸çä.

  Direction = 1; // Íàïðàâëåíèå äâèæåíèÿ 1 - ê íàáëþäàòåëþ, -1 - îò íåãî
  }
var
  Time: Double = 0;
  X0: Integer = 0;
  Y0: Integer = 0;
//  NumStars: Integer = 10;
  RangeY,RangeR,Height,Basis,DeltaY,Direction,lab_h,lab_w,Raz_Val:integer;    
  DeltaT,Period1,Amplitude2,Period2,Period3:real;
  K_VAL :string;
  Form1: TForm1;
  Stars: array[1..NumStars] of TPoint;
  img:array[1..7] of timage;
  labl:array[1..7] of TLabel;

implementation

{$R *.dfm}

procedure InitializeStars;
var
  i: Integer;
begin
  Randomize;
  for i := 1 to NumStars do
    with Stars[i] do
    begin
      Y := Random(RangeY);
      R := RangeR - 2 * Random(RangeR);
      Phi := Random(628) / 100;
    end;
end;

procedure Perspective(const X, Y, Z, Height, Basis: Double; var XP, YP: Double);
var
  Den: Double;
begin
  Den := Y + Basis;
  if Abs(Den) < 1E-100 then
    Den := 1E-100;
  XP := Basis * X / Den;
  YP := (Basis * Z + Height * Y) / Den;
end;

function KeyPressed(VKey: Integer): LongBool;
asm
   push eax
   call GetKeyState
   and eax, 0080h
   shr al, 7
end;

procedure TForm1.AB00(var Message);
begin
  if KeyPressed(VK_ESCAPE) then
    Close
  else
    Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var ini:Tinifile;
    i:integer;
begin
k_val:='123456789'; Raz_Val:=0;
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'Main.ini');
  LabeledEdit1.Text:=Ini.readstring('Stars','NumStars','2000');
  LabeledEdit2.Text:=Ini.readstring('Stars','RangeY','7000');
  LabeledEdit3.Text:=Ini.readstring('Stars','RangeR','7000');
  LabeledEdit4.Text:=Ini.readstring('Stars','Height','5000');
  LabeledEdit5.Text:=Ini.readstring('Stars','Basis','100');
  LabeledEdit6.Text:=Ini.readstring('Stars','DeltaY','2');
  LabeledEdit7.Text:=Ini.readstring('Stars','DeltaT','0,01');
  LabeledEdit8.Text:=Ini.readstring('Stars','Period1','0,1');
  LabeledEdit9.Text:=Ini.readstring('Stars','Amplitude2','0,15');
  LabeledEdit10.Text:=Ini.readstring('Stars','Period2','0,8');
  LabeledEdit11.Text:=Ini.readstring('Stars','Period3','0,2');
  LabeledEdit12.Text:=Ini.readstring('Stars','Direction','1');
  LabeledEdit13.Text:=Ini.readstring('global','path','');
  LabeledEdit14.Text:=Ini.readstring('global','Pict','');
  SpinEdit1.Value:=Ini.readinteger('global','Blik',50);

  Ini.Free;
  form1.Color:=clblack;
  form1.Align:=alclient;
  timer1.Interval:=SpinEdit1.Value;

  RangeY:=strtoint(LabeledEdit2.Text);
  RangeR:=strtoint(LabeledEdit3.Text);
  Height:=strtoint(LabeledEdit4.Text);
  Basis:=strtoint(LabeledEdit5.Text);
  DeltaY:=strtoint(LabeledEdit6.Text);
  Direction:=strtoint(LabeledEdit12.Text);

  DeltaT:=strtofloat(LabeledEdit7.Text);
  Period1:=strtofloat(LabeledEdit8.Text);
  Amplitude2:=strtofloat(LabeledEdit9.Text);
  Period2:=strtofloat(LabeledEdit10.Text);
  Period3:=strtofloat(LabeledEdit11.Text);
  if (LabeledEdit13.Text)<> '' then memo1.Lines.LoadFromFile(LabeledEdit13.Text);

img[1]:=image1;
img[2]:=image2;
img[3]:=image3;
img[4]:=image4;
img[5]:=image5;
img[6]:=image6;
img[7]:=image7;

labl[1]:=label1;
labl[2]:=label2;
labl[3]:=label3;
labl[4]:=label4;
labl[5]:=label5;
labl[6]:=label6;
labl[7]:=label7;

   label1.Font.Size:=form1.Width div 10;

   lab_h:=label1.Height;
   lab_w:=label1.Width;
//memo2.Lines.Add(inttostr(label1.Font.Size)+'-  -'+inttostr(lab_h)+'-'+inttostr(lab_w));

  for i:=1 to 7 do
  begin
  img[i].Stretch:=true;
  img[i].Show;
  img[i].Width:=lab_w*2;
  img[i].Height:=lab_h*2;
  img[i].Top:=(form1.Height-(img[i].Height div 2)*3) div 2;
  img[i].Left:=(form1.Width-img[i].Width) div 2 + img[i].Width*(i-2)-img[i].Width div 2;
//  memo2.Lines.Add(img[i].name+' L='+inttostr(img[i].Left)+' t='+inttostr(img[i].Top)+' W='+inttostr(img[i].Width)+' H='+inttostr(img[i].Height));
  if (LabeledEdit14.Text)<> '' then
     begin
     img[i].Picture.LoadFromFile(LabeledEdit14.Text);
     end;
  img[i].Repaint;
  labl[i].font.Size:=form1.Width div 10;
  labl[i].Top:=img[i].Top+(img[i].Height-labl[i].Height) div 2;
  labl[i].Left:=img[i].Left+(img[i].Width-labl[i].Width) div 2;
//  memo2.Lines.Add(labl[i].name+' L='+inttostr(labl[i].Left)+' t='+inttostr(labl[i].Top)+' W='+inttostr(labl[i].Width)+' H='+inttostr(labl[i].Height)+' FS='+inttostr(labl[i].Font.Size));
  end;

  InitializeStars;
  DoubleBuffered := True;

end;

procedure TForm1.FormPaint(Sender: TObject);
var
  X, Y: Double;
  L, T: Integer;
  i: Integer;
  D: Double;
begin
  for i := 1 to NumStars do
  begin
    Application.ProcessMessages;
    with Stars[i] do
    begin
      D := Direction * sin(Period3 * Time);
      Y := Y - D * DeltaY;
      X := R * sin((Period1 * Time + Phi) + Amplitude2 * cos(Period2 * time));
      Z := R * cos((Period1 * Time + Phi) + Amplitude2 * cos(Period2 * time));
      if D > 0 then
      begin
        if Y < 0 then
        begin
          Y := RangeY;
          R := RangeR - 2 * Random(RangeR);
          // Phi := Random(628) / 100;
        end;
      end
      else
      begin
        if Y > RangeY then
        begin
          Y := 0;
          R := RangeR - 2 * Random(RangeR);
          // Phi := Random(628) / 100;
        end;
      end;
    end;
    Perspective(Stars[i].X, Stars[i].Y, Stars[i].Z, Height, Basis, X, Y);
    L := X0 + Round(X);
    T := Y0 - Round(Y);
    Canvas.Pen.Color := clWhite;
    if Stars[i].Y < RangeY / 4 then
    begin
      Canvas.Rectangle(L, T, L + 2, T + 2);
    end
    else
    begin
      Canvas.MoveTo(L, T);
      Canvas.LineTo(L + 1, T + 1);
    end;
  end;
  PostMessage(Handle, $AB00, 0, 0);
  Time := Time + DeltaT;
end;

procedure TForm1.FormResize(Sender: TObject);
//var i:integer;
begin
 {
   label1.Font.Size:=form1.Width div 10;
   lab_h:=label1.Height;
   lab_w:=label1.Width;

  for i:=1 to 7 do
  begin
  img[i].Stretch:=true;
  img[i].Show;
  img[i].Width:=lab_w*2;
  img[i].Height:=lab_h*2;
  img[i].Top:=(form1.Height-(img[i].Height div 2)*3) div 2;
  img[i].Left:=(form1.Width-img[i].Width) div 2 + img[i].Width*(i-2)-img[i].Width div 2;
//  memo2.Lines.Add(img[i].name+' L='+inttostr(img[i].Left)+' t='+inttostr(img[i].Top)+' W='+inttostr(img[i].Width)+' H='+inttostr(img[i].Height));
  if (LabeledEdit14.Text)<> '' then
     begin
     img[i].Picture.LoadFromFile(LabeledEdit14.Text);
     end;
  img[i].Repaint;
  labl[i].font.Size:=form1.Width div 10;
  labl[i].Top:=img[i].Top+(img[i].Height-labl[i].Height) div 2;
  labl[i].Left:=img[i].Left+(img[i].Width-labl[i].Width) div 2;
//  memo2.Lines.Add(labl[i].name+' L='+inttostr(labl[i].Left)+' t='+inttostr(labl[i].Top)+' W='+inttostr(labl[i].Width)+' H='+inttostr(labl[i].Height)+' FS='+inttostr(labl[i].Font.Size));
  end;
  }
  X0 := ClientWidth div 2;
  Y0 := ClientHeight * 3 div 2;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
     if Raz_Val=0 then Raz_Val:=1 else Raz_Val:=0;

     randomize;
     k_val:=memo1.Lines.Strings[random(memo1.Lines.Count-1)];
     label1.Caption:=k_val[1];
     label2.Caption:=k_val[2];
     label3.Caption:=k_val[3];
     label4.Caption:=k_val[4];
     label5.Caption:=k_val[5];
     label6.Caption:=k_val[6];
     label7.Caption:=k_val[7];
end;

procedure TForm1.OptionsClick(Sender: TObject);
begin
  GroupBox1.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
var ini:Tinifile;
begin
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'Main.ini');
  LabeledEdit1.Text:=Ini.readstring('Stars','NumStars','2000');
  LabeledEdit2.Text:=Ini.readstring('Stars','RangeY','7000');
  LabeledEdit3.Text:=Ini.readstring('Stars','RangeR','7000');
  LabeledEdit4.Text:=Ini.readstring('Stars','Height','5000');
  LabeledEdit5.Text:=Ini.readstring('Stars','Basis','100');
  LabeledEdit6.Text:=Ini.readstring('Stars','DeltaY','2');
  LabeledEdit7.Text:=Ini.readstring('Stars','DeltaT','0,01');
  LabeledEdit8.Text:=Ini.readstring('Stars','Period1','0,1');
  LabeledEdit9.Text:=Ini.readstring('Stars','Amplitude2','0,15');
  LabeledEdit10.Text:=Ini.readstring('Stars','Period2','0,8');
  LabeledEdit11.Text:=Ini.readstring('Stars','Period3','0,2');
  LabeledEdit12.Text:=Ini.readstring('Stars','Direction','1');
  SpinEdit1.Value:=Ini.readinteger('global','Blik',50);
  Ini.Free;

  RangeY:=strtoint(LabeledEdit2.Text);
  RangeR:=strtoint(LabeledEdit3.Text);
  Height:=strtoint(LabeledEdit4.Text);
  Basis:=strtoint(LabeledEdit5.Text);
  DeltaY:=strtoint(LabeledEdit6.Text);
  Direction:=strtoint(LabeledEdit12.Text);

  DeltaT:=strtofloat(LabeledEdit7.Text);
  Period1:=strtofloat(LabeledEdit8.Text);
  Amplitude2:=strtofloat(LabeledEdit9.Text);
  Period2:=strtofloat(LabeledEdit10.Text);
  Period3:=strtofloat(LabeledEdit11.Text);

  GroupBox1.Hide;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ini:Tinifile;
begin
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'Main.ini');
  Ini.writestring('Stars','NumStars',LabeledEdit1.Text);
  Ini.writestring('Stars','RangeY',LabeledEdit2.Text);
  Ini.writestring('Stars','RangeR',LabeledEdit3.Text);
  Ini.writestring('Stars','Height',LabeledEdit4.Text);
  Ini.writestring('Stars','Basis',LabeledEdit5.Text);
  Ini.writestring('Stars','DeltaY',LabeledEdit6.Text);
  Ini.writestring('Stars','DeltaT',LabeledEdit7.Text);
  Ini.writestring('Stars','Period1',LabeledEdit8.Text);
  Ini.writestring('Stars','Amplitude2',LabeledEdit9.Text);
  Ini.writestring('Stars','Period2',LabeledEdit10.Text);
  Ini.writestring('Stars','Period3',LabeledEdit11.Text);
  Ini.writestring('Stars','Direction',LabeledEdit12.Text);
  Ini.writestring('global','path',LabeledEdit13.Text);
  Ini.writestring('global','Pict',LabeledEdit14.Text);
  Ini.writeinteger('global','Blik',SpinEdit1.Value);
  Ini.Free;

  RangeY:=strtoint(LabeledEdit2.Text);
  RangeR:=strtoint(LabeledEdit3.Text);
  Height:=strtoint(LabeledEdit4.Text);
  Basis:=strtoint(LabeledEdit5.Text);
  DeltaY:=strtoint(LabeledEdit6.Text);
  Direction:=strtoint(LabeledEdit12.Text);

  DeltaT:=strtofloat(LabeledEdit7.Text);
  Period1:=strtofloat(LabeledEdit8.Text);
  Amplitude2:=strtofloat(LabeledEdit9.Text);
  Period2:=strtofloat(LabeledEdit10.Text);
  Period3:=strtofloat(LabeledEdit11.Text);
  
  timer1.Interval:=SpinEdit1.Value;
  GroupBox1.Hide;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  memo1.Clear;
  if opendialog1.Execute=true then memo1.Lines.LoadFromFile(opendialog1.FileName);
  LabeledEdit13.Text:=opendialog1.FileName;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if opendialog1.Execute=true then
  begin
  image1.Picture.LoadFromFile(opendialog1.FileName);
  image2.Picture.LoadFromFile(opendialog1.FileName);
  image3.Picture.LoadFromFile(opendialog1.FileName);
  image4.Picture.LoadFromFile(opendialog1.FileName);
  image5.Picture.LoadFromFile(opendialog1.FileName);
  image6.Picture.LoadFromFile(opendialog1.FileName);
  image7.Picture.LoadFromFile(opendialog1.FileName);
  LabeledEdit14.Text:=opendialog1.FileName;
  end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   if Raz_Val=0 then
     begin
     memo2.Lines.Add('Raz_Val='+inttostr(Raz_Val));
     label1.Caption:=inttostr(random(10));
     label2.Caption:=inttostr(random(10));
     label3.Caption:=inttostr(random(10));
     label4.Caption:=inttostr(random(10));
     label5.Caption:=inttostr(random(10));
     label6.Caption:=inttostr(random(10));
     label7.Caption:=inttostr(random(10));
     end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 If key=VK_Escape then Close;
end;

end.
Но это прога подвисает Подскажите, из-за чего у неё висяки ?
FlyD
Дата: 25.05.2011 14:37:09
werwolf_ua,

пошаговая отладка (F7, F8) в руки для локализации места зависания
Anatoly Podgoretsky
Дата: 25.05.2011 14:37:53
Многа букав
Jude
Дата: 25.05.2011 14:44:17
werwolf_ua,

Если при копировании включишь русский - в комментариях будут русские буквы вместо криказябров.
Jude
Дата: 25.05.2011 14:46:30
werwolf_ua,

кстати программа не просто "генерирует случайные числа")
Johnmen
Дата: 25.05.2011 14:55:27
werwolf_ua
Мой приятель написал прогу, генерирующую случайные числа, ...
Но это прога подвисает Подскажите, из-за чего у неё висяки ?

А что говорит приятель?
Его мнение очень важно для Вас (с)
Gerasimenko
Дата: 25.05.2011 15:21:21
werwolf_ua,

Не вдаваясь во много буковок, прежде всего проверти свой Timer
автор
SpinEdit1.Value:=Ini.readinteger('global','Blik',50);
...
timer1.Interval:=SpinEdit1.Value;
И далее по программе
автор
timer1.Interval:=SpinEdit1.Value
Ega
Дата: 25.05.2011 15:27:55
Даже читать не стал. Код ужасен. Зови приятеля.
gt156
Дата: 25.05.2011 15:30:06
Я так понимаю - это из разряда:
"Мопед не мой, я просто разместил объяву":))
Anatoly Podgoretsky
Дата: 25.05.2011 15:41:02
Ega
Даже читать не стал. Код ужасен. Зови приятеля.

Бить будешь?