|
정말 감사합니다!!
타이머를 이용하여 하는 방법이 있다고 해서 간단한 테스트를 하였는데 빠져나오지 못했습니다 ㅠㅠ
어떤 문제가 있어서 못빠져나오는지 알고싶습니다. ㅠ
void __fastcall TForm2::btn_TimerGoClick(TObject *Sender) // 타이머를 시작하는 버튼
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::btn_TimerStopClick(TObject *Sender) // 타이머를 정지시키는 버튼
{
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::t_TestTimer(TObject *Sender) // 타이머가 시작되면 While문 무한루프를 돌게하는 함수
{
while(1){
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
정영훈 님이 쓰신 글 :
: 해당 문제를 해결하시려면 프로세스와 쓰레드의 개념이 필요합니다.
: exe파일을 실행을 하면 프로세스가 생성되며 프로세스내 메인쓰레드를 생성하여 수행하게 됩니다.
: 쉽게 정리를 하면 폼이 메인쓰레드 입니다.
: 그 메인쓰레드에서 for, while 등의 작업을 시키케 되면 일을 하는 동안에는 폼이 해야 할 일을 할 수가 없게 됩니다.
: 사람도 마찬가지로 키보드가 1개인데 동시에 두가지를 코딩할 순 없습니다.
: 그러나 키보드가 2개라면 몸은 힘들고 결과는 좀 늦겠지만 동시에 진행은 가능합니다.(적절한 비유일진 모르겠습니다.)
: 즉 for, while 처리를 위한 쓰레드를 별도로 생성하여 처리를 해줘야 합니다.
: (간단한 방법으로 타이머를 이용하는 방법도 있습니다.)
:
: 임용태 님이 쓰신 글 :
: : 빌더를 공부하는 초보입니다.
: :
: : For문과 While문을 처리하는 도중에 폼 닫기버튼을 누르면 닫히지 않습니다.
: :
: : 디버깅을 해본 결과 Main폼에서는 닫기 버튼을 누르면 FormClose()이벤트 안으로는 들어는 가는데 닫히지 않습니다.
: :
: : 그리고 Main폼이 아닌 다른 폼에서는 닫기 버튼을 눌러도 FormClose()이벤트 안으로 들어오지 않습니다. ㅠㅠ
: :
: : For문과 While문이 끝난 후에 프로그램이 종료됩니다 ㅠㅠ
: :
: : 어떻게 해야하나요? ㅠㅠ
: :
: : void __fastcall TForm2::DelayTime(int nTime) //원하는 시간만큼 Delay를 주는 함수.
: : {
: : MSG message;
: :
: : clock_t clk = clock() + nTime;
: : while(1) {
: : Sleep(1);
: : if(clock() > clk)
: : break;
: : }
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm2::btGoClick(TObject *Sender) // 버튼을 클릭하면 사각형을 순서대로 그리는 함수.
: : {
: : bGoStop = true;
: : for (int i = 5; i < 35; i++) {
: : Application->ProcessMessages(); // 다른 이벤트를 받아온다.
: : Image1->Canvas->Rectangle(i,i,5*i,5*i);
: : DelayTime(500);
: : }
: : }
|