Q&A

  • 기다리기...
procedure TForm1.FormCreate(Sender: TObject);

begin

HttpGet.GetFile;

sleep(3000);

while FileExists('test.txt') do

Memo1.Lines.LoadFromFile('test.txt');

end;



제가 위와 같은 코딩을 했습니다.

인터넷에서 test.txt 파일을 폼이 생성되면서 다운로드 받고

그 파일을 메모 폼에 넣게 했습니다.

그런데 문제가 있습니다.

처음 실행하면 test.txt 내용을 못 읽습니다.

그러나 두번째 실행하면 읽습니다.

즉, 처음 실행해서 다운을 받았는데 바로 진행이 넘어가

메모 폼에는 글이 입력이 안되고 두번째 실행하면 이미 다운받은 파일이

있기에 열리는 것 같습니다.

그래서 제가 위와 같은 while 문을
3  COMMENTS
  • Profile
    홍성락 2001.07.24 05:43
    일단 런타임에 걸려 프로그램이 설 경우를 대비 게이지를 반복사용하거나 타이머등을 이용해야하구요, 런타임에 안걸리면 그냥 while문만 써도 될것같군요

    일단 코딩상 오류를 말씀드릴게요

    while FileExists('c:test.txt') do 는 참일때 즉 파일이 있을때만 무한정 실행되므로 처음 파일을 받아올때 전송속도로 생성되지 않으면 기냥 지나갑니다. 또 2번째 실행할경우는 무한정 메모컴포넌트에 쓰고 나오질않아요.

    그래서 이렇게 not붙이고 뒤에 ;를 쓰시면될것 같은데요.

    while not FileExists('c:test.txt') do;



    그러나 더 좋은 방법은 이런 무한정 기다리는 것보다 다른 좋은 방법을 써봐야하고요.

    그래도 생각나지 않으면 읽어오는 버튼, 반영하는 버튼 따로사용하거나

    이런종류의 무한 루프는 취소가능하도록 버튼을 만들어주면 될것같습니다.이때

    다른 프로세스에 이벤트가 가능하도록 Application.ProcessMessages를 사용하면서요..





    이순만 wrote:

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > HttpGet.GetFile;

    > sleep(3000);

    > while FileExists('test.txt') do

    > Memo1.Lines.LoadFromFile('test.txt');

    > end;

    >

    > 제가 위와 같은 코딩을 했습니다.

    > 인터넷에서 test.txt 파일을 폼이 생성되면서 다운로드 받고

    > 그 파일을 메모 폼에 넣게 했습니다.

    > 그런데 문제가 있습니다.

    > 처음 실행하면 test.txt 내용을 못 읽습니다.

    > 그러나 두번째 실행하면 읽습니다.

    > 즉, 처음 실행해서 다운을 받았는데 바로 진행이 넘어가

    > 메모 폼에는 글이 입력이 안되고 두번째 실행하면 이미 다운받은 파일이

    > 있기에 열리는 것 같습니다.

    > 그래서 제가 위와 같은 while 문을
  • Profile
    中山美穗 2001.07.23 12:08
    [원인]



    1. HttpGet.GetFile;



    잘 만들어진 HTTP 컴포넌트는 전송시작/전송중/전송끝과 같은 이벤트를 발생시킵니다.

    만약 이를 지원하지 않는다면 개발에 많은 애로사항이 있을듯 싶습니다.



    2. Sleep(3000);



    Sleep문은 실행중인 스레드를 완전히 중지시키는 명령입니다.

    즉 GetFile 명령이 시작됨과 동시에 Sleep 명령으로 인해 실행이 중지됩니다.



    3. while FileExists('test.txt') do



    while문은 조건이 참(True)인 경우에만 반복하는 명령입니다.

    test.txt가 존재하지 않는다면 당연히 지나치겠지요.

    더구나 do 다음에 ;이 없습니다.

    즉 Memo1.Lines.LoadFromFile('test.txt');도 같이 지나친다는 이야기입니다.



    [해답]



    procedure TForm1.FormCreate(Sender: TObject);

    HttpGet.GetFile;

    while not FileExist(ExtractFilePath(Application.ExeName) + 'test.txt') do

    Application.ProcessMessages;

    Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'test.txt);

    end;

  • Profile
    이순만 2001.07.23 14:27
    우와........ 감사합니다.

    솔직히 답변해 주신 것을 아직도 잘 이해가 안가는 부분이

    많은데 이 답변만으로도 제가 많이 배울 것 같습니다.

    정말 감사드립니다.







    中山美穗 wrote:

    > [원인]

    >

    > 1. HttpGet.GetFile;

    >

    > 잘 만들어진 HTTP 컴포넌트는 전송시작/전송중/전송끝과 같은 이벤트를 발생시킵니다.

    > 만약 이를 지원하지 않는다면 개발에 많은 애로사항이 있을듯 싶습니다.

    >

    > 2. Sleep(3000);

    >

    > Sleep문은 실행중인 스레드를 완전히 중지시키는 명령입니다.

    > 즉 GetFile 명령이 시작됨과 동시에 Sleep 명령으로 인해 실행이 중지됩니다.

    >

    > 3. while FileExists('test.txt') do

    >

    > while문은 조건이 참(True)인 경우에만 반복하는 명령입니다.

    > test.txt가 존재하지 않는다면 당연히 지나치겠지요.

    > 더구나 do 다음에 ;이 없습니다.

    > 즉 Memo1.Lines.LoadFromFile('test.txt');도 같이 지나친다는 이야기입니다.

    >

    > [해답]

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > HttpGet.GetFile;

    > while not FileExist(ExtractFilePath(Application.ExeName) + 'test.txt') do

    > Application.ProcessMessages;

    > Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'test.txt);

    > end;