Q&A

  • ProgressBar와 Gauge에 관련되어..
안녕하세요... 초보 인사드립니다...
[제일 중요한 질문부터 드릴께요... 게시판에 아래보면 게시물검색란이 있는데... 안되는건가요..?? 관련자료를 찾으려 검색을 해도.. 항상 '0'이네요...??]

다름이 아니오라.. 아래의 ProgressBar 와 Gauge에 관련되어 테스트를 하고 있는데..
문제가 발생했습니다..
둘다 Min값은 '0'에서 부터 Max값인 'IFileSize'까지 잡았습니다.
(이 파일은 음악파일로써.. 음악이 종료되면 100%가 되도록 하고자 합니다.)
그런데...
물론 찍어본 결과 IFileSize값은 277KByte가 들어옵니다...
그래서 For문을 277K까지 읽게 돌려놓고, 처음부터 마지막까지 읽어내는 것을 ProgressBar와 Gauge에 진행사항을 표시하려고 하는데...
277K를 다 읽기전에 100% 끝나버리네요...
277K를 다 읽어 들이는 시간에 100% 정확히(물론 약간의 차이는... 괜찮지만) 끝나게 하려면....
어떻게 처리를 해야 하는지..??
소스 좀 봐주세요.. ^^(허접한 소스 뜯어 고칠 부분이 많을 줄 압니다.)

한가지 더 궁금한 사항이 있어서요...
Thread를 만들었는데.. 중간에 정지시키고자 합니다... 어떻게..??
그리고 보시면 아시겠지만... 실행중 실행버튼을 한 번 더 누르면 다운이 되어 버리리고,
ProgressBar및 Gauge가 '0'이 되지 않는데....??
Thread때문인지요..?? 어떻게 해야 할까요..??

function ThreadFunc : integer ; stdcall;
var
   i : integer;
begin
   Form1.ProgressBar1.Min := 0;
   Form1.ProgressBar1.Max := IFileSize;

   Form1.Gauge1.MinValue := 0;
   Form1.Gauge1.MaxValue := IFileSize;
   Form1.Gauge1.Progress := 0;

   for i := 0 to IFileSize do
   begin
       Form1.ProgressBar1.Position := i;
       Form1.Gauge1.Progress := i;
   end;
   Form1.Gauge1.Progress := 0;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
//파일핸들 변수 지정
   FH3 : Integer;
//    aaa : String;

   //ProgressBar 처리
   ThreadID : DWord;

begin
   Form1.Gauge1.Progress := 0;
   Form1.ProgressBar1.Position := 0;
   PtBreakPlayFile(aa);

   if openDialog1.Execute then begin
       FH1 := OpenDialog1.FileName;
   end;
   if FileExists(FH1) then begin
       CellGrid.Cols[5].Strings[1]:= openDialog1.Filename;
       CellGrid.Cols[2].Strings[1]:='PLAYSTART';

   FH3 := FileOpen(OpenDialog1.FileName, fmOpenRead);
   IFileSize :=FileSeek(FH3,0,2);
   fileClose(FH3);

   PtPlayFile(aa, pchar(FH1));

   CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID); //Thread 생성

   end
   else
   begin
       PtBreakPlayFile(aa);
   end;
end;

2  COMMENTS
  • Profile
    이순구 2003.03.14 20:47
    일단 게시판 검색은 잘 됩니다..... 관련된 자료가 없으면 물론 검색을 해도 나타나지 않겠지요..

    그리고 님이 하고자 하는 프로그램은 음악파일이 플레이 되는 상황을 프로그레스바에 표시하고자 하는 것 같은데요....
    음악파일을 어떻게 플레이 하는지가 나타나지 않아서 뭐라고 답변하기가 어렵습니다.  님이 만든 프로그램 내에서 직접 플레이를 한다면 진행상황을 표시할 수 있겠지만 다른 프로그램을 실행시켜서 플레이 한다면 진행상황을 표시하기가 어렵습니다.
      그리고 님이 만든 Thread는 그냥 음악파일의 플레이 상황과 관계없이 프로그레스바만 진행시키고 종료되는 것 아닌가요?...  
      예를 들어 델파이에 있는 MediaPlayer컴포넌트를 사용하여 플레이하거나, DirectX를 써서 플레이 한다면 진행상황을 표시할 수 있을 것 같습니다..
    좀 더 자세한 상황을 올리면 답글이 있을 것 같구요.........
      이상 허접한 답변이었습니다.........
  • Profile
    초보왕 2003.03.14 23:10
    답변감사합니다...
    아래의 소스에서 플레이를 시키는 것은 Test.pas라는 파일에 있는 PtPlayFile핸들을 실행하게 되어 있습니다..
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Test, Grids, MMSystem,   MPlayer, Gauges;
    .......{중략}
    aa : pChannelHandle;
    .......{중략}

    Test.pas의 파일은 아래와 같습니다.

    function  PtPlayFile  (pChanHandle:pChannelHandle; PlayFilename:PChar) : SmallInt; cdecl;

    이 부분은 PtPlayFile(aa, pchar(FH1));에 플레이하고자 하는 파일명만 실행이 되게 되어 있습니다.
    멈추게 하는 것은...PtBreakPlayFile(aa); 이부분입니다.

    문제는... 음악이 재생되는 동안 ProgressBar 및 Gauge를 움직여야 하는데.. 그래서 쓰레드를 썼고... 쓰레드에서는 전체파일의 용량(FH1)을 체크해서 Max값까지 돌리려고하는데...{제가 생각을 잘 못하고 있지는 않은지..???}

    => 플레이도 되어야 하구.. ProgressBar와 Gauge도 진행사항이 표시 되어야 하는데...두가지를 동시에 하려면 Thread를 사용하여야 할것 같은데...
    어떻게 처리를 해야 할런지...?? 감감하네요....
    그리고... 실행버튼을 눌러 놓고.. 다시 한번 더 실행버튼을 누르면 멈춰버리는데 이것은 어떻게 하여야 할까요??

    좀 어떻게 안될까요..?? 많은 수정이 있어야 되는지 알겠는데.. 어떻게 만져야 하는지..??
    고수님들... 좀 도와주세요..