Q&A

  • 동적생성한 두개의 폼을 독립적으로 실행하고 싶어요..
폼1에서 버튼을 클릭하여 폼2를 동적으로 두개 생성했습니다.
다음 폼2의 버튼을 클릭하면 루프를 50번 돌면서 for문의 첨자값을 라벨에
뿌려지도록 했습니다.
여기서 궁금한것은 생성된 두개의 폼2의 처리를 각각 독립적으로
처리하게 하고 싶은데 그게 잘 안됩니다.
폼1에서 생성한 두개의 폼2를 생성된 순서데로 편의상 A와 B로 칭한다면
A의 버튼을 클릭하여 20번쯤 돌게 되었을때 B의 버튼을 클릭하면
A는 그 수행을 20에서 멈추고 B에서 다시 1부터 시작을 하다가 B가 50번까지
모두 수행하면 다시A로 와서 멈추었던 20번부터 비로소 루프를 마칠때까지
실행됩니다.
전 A든 B든 버튼을 클릭하면 서로 독립적으로 루프가 끝날때까지 끊기지 않고
실행되길 바라는데 무엇이 잘못인지 모르겠습니다.
이나마도 ProcessMessages를 사용하지 않으면 어느 한쪽 처리가 끝날때까지는
다른 폼의 버튼이 눌리어 지지도 않습니다.
부디 가르쳐 주시면 고맙겠습니다.
두서없이 질문드렸습니다만 아래에 폼1과 폼2부분의 소스가 있으니
한번테스트 해보시고 답변 주셨으면 고맙겠습니다.
그럼 즐거운 하루 되시길....



//폼1
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i := 0 to 1 do
begin
   form2 := Tform2.create(self);
   form2.show;
end;
end;

end.


//폼2
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.Button1Click(Sender: TObject);
var i : integer;
begin
for i := 0 to 50 do
begin
   application.ProcessMessages;
   label1.Caption := inttostr(i);
   refresh;
   sleep(100);
end;
label1.Caption := '완료';
end;

end.
2  COMMENTS
  • Profile
    장은석 2003.03.15 00:19
    올만에 답글 올리네여.. 쩝

    이런경우 동적생성할 Form2를 쓰레드로 생성하세요
    그럼 생성된 쌍동이놈들이 질문 상황과 달리
    말 안들어 먹고(?) 고집스럽게 자기일만 할겁니다.
    Form2는 걍 놔두시구요 Form1의 소스를 아래처럼 수정해보세요..

    그나저나 누가 혹시 Mscomm32.ocx 보다 더 쓸만한 콤포 알고 계신분 없나여?




    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    type
    TForm1 = class(TForm)
       Button1: TButton;
       procedure Button1Click(Sender: TObject);
    private
       { Private declarations }
    public
       { Public declarations }
    end;

    type
    TAT = class(Tthread)
    protected
      procedure Execute; override;
    end;

    var
    Form1: TForm1;
    AT : TAT;

    implementation


    uses Unit2;


    {$R *.DFM}

    procedure TAT.Execute;
    var i : integer;
    begin
    Form2 := TForm2.Create(Form1);
    Form2.Showmodal;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var i : integer;
    begin
    for i := 0 to 1 do  
    AT := TAT.Create(false);
    end;

    end.
  • Profile
    김영대 2003.03.14 21:09
    // 안녕하세요 김영대 (http://www.howto.pe.kr )입니다

    thread 를 사용해 보세요
    프로세스당의 CPU 할당에는 제한이 있으므로 쓰레드같은것을
    이용하여 CPU를 부분할당 받아야 할겁니다
    아래는 그냥 thread 사용 예제인데 조금 수정하면 될겁니다

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs,StdCtrls;

    type
      timethread = class(Tthread)
      protected
        procedure execute; override;
    end;


    type
      TForm1 = class(TForm)
        timelabel: TLabel;
        mathButton: TButton;
        input1: TEdit;
        input2: TEdit;
        answer: TEdit;
        procedure mathButtonClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      TIME_THREAD: TIMEthread;

    implementation
    {$R *.DFM}

    {*****NOTE THAT THIS PROCEDURE IS FOR THE TIMEthread CLASS!!!!!!*******}
    procedure timethread.execute;
    var
      go: boolean ;
      timestring: string;
    begin
      go := true;
      repeat
        timestring := formatdatetime('H:mm:ss am/pm',now);
        form1.timelabel.caption := timestring;
      until go = false;
    end;

    {**************************************************************************}
    {*********this is all you need for this demo as far as the thread**********}

    procedure TForm1.mathButtonClick(Sender: TObject);
    begin
      answer.text:=inttostr(strtoint(input1.text)+strtoint(input2.text));
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      time_thread:=timethread.create(false);
    end;

    end.

    // Mike in the UK asks, "okay, but how do we turn that damn thread off?" Thank
    // you, Mike... It's nice to know that someone is paying attention! :) Here's a
    // REAL complicated example of how to go about it!!

    procedure btn_PauseClick(Sender:tobject);
    begin
      Time_thread.suspend;
    end;

    procedure btn_ResumeClick(Sender:Tobject);
    begin
      Time_thread.resume;
    end;

    Procedure btn_KillClick(Sender:tobject);
    begin
        Time_thread.terminate;
    end;