Q&A

  • 초보의 소스를 봐주세여..(bmp, zlib, canvas)
안녕하세요?
조금은 막연한 문제지만 해결하는 방법도 막연해서 이렇게 질문란에 올립니당..혹시 소스에 문제가 있는지 고수님들이 봐주세영~ 고수님의 지도 부탁드릴께용~ ^-^;;

다음 루틴은 파라미터로 넘어온 string형 data를 zlib압축으로 풀어서 파라미터러 넘어온 TCanvas형 canvs에다가 bitmap을 그려주는건데요.

문제는 이 루틴을 굉장히 빨리 반복(쓰래드 처리)하면 어느정도(어떨때는 1분정도, 또 어떨때는 5초정도로 고정되있지 않음) 있으면 파라미터러 넘어온 canvs가 갑자기 하얗게 되어서 그후로는 bitmap이 그려지지 않아여..데이터는 정상적으로 넘어오는데도 말이죠..ㅡ.ㅡ;; 어디서 문제가 생기는지 통 모르겠습니다.

procedure UnCompressBitmap(const Data: string; canvs: TCanvas; x, y: integer; ms: TMemoryStream; bmp: TBitmap);
var
  buf: pointer;
  size: integer;
begin
  if Length(Data) <= 0 then Exit;

  try
     DecompressBuf(@Data[1], Length(Data), Length(Data) * 3, buf, size);
  except
     on E: Exception do
     begin
        E.Message := Format('윽..압축풀다 에러났다. Error Decompressing Buffer (Len = %d):'#13#10'%s',
           [Length(Data), e.Message]);
        raise;
     end;
  end;

  ms.Position := 0;
  ms.Write(buf^, size);
  FreeMem(buf);
  ms.Position := 0;
  // Assert(bmp<>nil);
  bmp.LoadFromStream(ms);
  canvs.Draw(x, y, bmp);
end;
2  COMMENTS
  • Profile
    김세형 2002.10.22 11:15
    질문이 너무 막연했었습니다.

    자답으로 올릴께여~ 쓰래드의 Synchronize 함수로 해결했습니당~ ^^;;
    쓰래드에서 안전하게 VCL을 다루기 위해서 Synchronize함수를 쓰다고 도움말에 나오네여
    영어가 짧아서 명쾌한 번역은 안되네여.. ^^;; 정확한 내용은 직접 확인해 주세여~ ^^

    이하원문=========================================================================

    When you use objects from the VCL object hierarchy, their properties and methods are not guaranteed to be thread-safe. That is, accessing properties or executing methods may perform some actions that use memory which is not protected from the actions of other threads. Because of this, a main VCL thread is set aside for access of VCL objects. This is the thread that handles all Windows messages received by components in your application.
    If all objects access their properties and execute their methods within this single thread, you need not worry about your objects interfering with each other. To use the main VCL thread, create a separate routine that performs the required actions. Call this separate routine from within your thread뭩 Synchronize method. For example:

    procedure TMyThread.PushTheButton;

    begin
      Button1.Click;
    end;
    procedure TMyThread.Execute;
    begin
      ...
      Synchronize(PushTheButton);
      ...
    end;

    Synchronize waits for the main VCL thread to enter the message loop and then executes the passed method.

    Note:        Because Synchronize uses the message loop, it does not work in console applications. You must use other mechanisms, such as critical sections, to protect access to VCL objects in console applications.

    You do not always need to use the main VCL thread. Some objects are thread-aware. Omitting the use of the Synchronize method when you know an object뭩 methods are thread-safe will improve performance because you don뭪 need to wait for the VCL thread to enter its message loop. You do not need to use the Synchronize method in the following situations:

    Data access components are thread-safe as long as each thread has its own database session component. The one exception to this is when you are using Access drivers. Access drivers are built using the Microsoft ADO library, which is not thread-safe.

    When using data access components, you must still wrap all calls that involve data-aware controls in the Synchronize method. Thus, for example, you need to synchronize calls that link a data control to a dataset by setting the DataSet property of the data source object, but you don뭪 need to synchronize to access the data in a field of the dataset.
    For more information about using database sessions with threads, see Managing multiple sessions.

    Graphics objects are thread-safe. You do not need to use the main VCL thread to access TFont, TPen, TBrush
    , TBitmap, TMetafile, or TIcon. Canvas objects can be used outside the Synchronize method by locking them.
            While list objects are not thread-safe, you can use a thread-safe version, TThreadList, instead of TList.




  • Profile
    타락천사 2002.10.22 02:01
    안녕하세여.. 타락임다..

    Canvas 는 ThreadSafe 합니다..

    Canvas.Lock 과 Canvas.UnLock 을 쓰세여..

    즐푸하세여..

    타락천사..

    • 샤리
    • 2002.10.21 21:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 전종표
      2002.10.21 22:09
      델7에 보면 Indy 가 있습니다.  그걸로 대체되었습니다. Indy 의 데모는 델설치프로그램에 ...
    • 김해성
    • 2002.10.21 21:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 전종표
      2002.10.21 21:59
      SpeedButton 은 DataSet 과 연결할 수 없습니다. 따라서 OnClick 에 직접 프로그램을 넣으셔야 합니다....
    • 김해성
      2002.10.21 22:38
      Button과 연결할려면 어떻게 해야돼여?
    • 이치영
    • 2002.10.21 20:58
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 전종표
      2002.10.21 21:16
      ---- unit2.pas ...    function PumSearch(cFileNo:string): TClientDataSet; functi...
    • 2002.10.21 20:28
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 전종표
      2002.10.21 20:59
      DB 의 EOF 를 모르는게 아닌가 싶네요.  그냥 DB 만 연결해서 출력한 것 같진 않고,  ...
    • 2002.10.21 23:41
      질문에 대한 답변 감사 드립니다. 데이터를 앞으로 옮기는 작업이 어떤것을 말하는지 잘 몰라서 이렇게 ...
    • 김기성
    • 2002.10.21 20:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2002.10.21 20:16
      DelForEx 란게 있습니다. 자료실을 검색해 보심 나올겁니다. 즐푸하세여.. 타락천사.
    • 정희섭
    • 2002.10.21 19:25
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 정희섭
      2002.10.22 02:03
      tdump edrlib.dll 을 실행한 결과 -stdcall 또는 CALLBACK 인경우 Exports from EDRLIB.dll  ...
    • 이광수
      2002.10.21 23:53
      우선 dependeny walker인데요. 좀 잘못알려드렸군요. vc++을 다 까셨다면 시작폴더에 등록된 것에 보시...
    • 이광수
      2002.10.21 20:23
      VC++에서 Dependency walker로 보시면 이해가 가실겁니다. dll을 열어보시면요. 즉 cdecl로 컴파일하시...
    • 정희섭
      2002.10.21 21:00
      자꾸 질문해서 미안합니다.
    • 타락천사
      2002.10.21 20:12
      안녕하세여. 타락임다.. 흘흘.. 어려운 질문 이군여..^^ 주로 DLL 을 쓸때(호환 문제에) 필요한 사항 ...
    • 정희섭
      2002.10.21 21:06
      답변 감사드립니다. VC++ DLL에서 CALLBACK 대신에 __stdcall 로 선언하고 델파이에서 stdcall로 바꾸...
    • 타락천사
      2002.10.21 22:36
      안녕하세여. 타락임다.. VC++ DLL 써본지가 오래되서, 기억이 잘 안납니다.. 앞의 코드에선 CALLBACK...
    • 김장호
    • 2002.10.21 12:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2002.10.22 03:51
      안녕하세요. 타락임다.. 아마 Canvas 에는 회전된 그림이 있을 겁니다.. TBitmap 을 선언해서.. C...
    • 박상윤
      2002.10.21 19:25
      24비트 RGB (8bit,8bit,8bit) 16-5,5,5    -5,6,5 포맷 2가지입니다.    그럼 여...
    • 나윤호
    • 2002.10.21 05:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2002.10.21 20:46
      안녕하세여. 타락임다.. ActiveForm Paint 이벤트가 점 문제가 있나여? 그럼 ActiveForm 크기에 해당...
    • 나윤호
      2002.10.21 23:50
      activeX콘트롤 말하는거 맞는데요....델파이에서 acitveFrom이라구 되어있잖아요....일반 애플로 했던것을 ...
    • 롯데
    • 2002.10.21 04:00
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2002.10.21 20:24
      안녕하세여. 타락임다.. 아래는 제가 팁에 올린 Directory&File Delete/Move/Rename 함수 임다. /...
    • 정성훈
      2002.10.21 19:47
      팁에서 가져온 자료입니다. 참조하세요..(하위폴더까지 복사함..) 디렉토리 단위로 복사하는 재귀호출 ...
    • 롯데
      2002.10.21 21:32
      답변 감사합니다. 코드를 아래와 같이 고치면 조금 더 낫군요..  너무 감사합니다.  ...
    • 롯데
      2002.10.21 21:48
      아참.. 그리고 while 문 블럭 다음에 반드시 아래 코드를 써주셔야 할 것 같습니다. 감사합니다. &nbs...
    • 타락천사
      2002.10.21 18:51
      안녕하세요. 타락임다. 보아하니 Win2K 에서 Virtual SMTP Server 를 활용해서 메일을 발송하려는가 보...
    • 김세형
    • 2002.10.21 01:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김세형
      2002.10.22 11:15
      질문이 너무 막연했었습니다. 자답으로 올릴께여~ 쓰래드의 Synchronize 함수로 해결했습니당~ ^^;; ...
    • 타락천사
      2002.10.22 02:01
      안녕하세여.. 타락임다.. Canvas 는 ThreadSafe 합니다.. Canvas.Lock 과 Canvas.UnLock 을 쓰세여.....
    • 이영동
    • 2002.10.20 22:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • *^^*
      2002.10.21 02:44
          필드 선택하시고, 프로퍼티 보면     "DisplY Format" 에다...
    • 김종균
    • 2002.10.20 21:03
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 정성훈
      2002.10.21 19:40
      strout := inttostr(strtoint(strout) * 500); 이부분이죠? 날짜 * 500억씩 ㅡ.ㅡ 아래 Lookup 설명한...
    • 정경철
      2002.10.20 21:25
      lockup field가 아님니다.. 죄송 합니다. Calculated Field를 만들어서 날자와 연체료를 계산하면 될것...
    • 정경철
      2002.10.20 21:20
      lockup Field 를 만들어서 해보세요..
    • 김종균
      2002.10.20 22:26
      lockup Field가 먼지 모르거든여.. 답변부탁드립니다. 좋은 하루되세요
    • 정성훈
      2002.10.21 19:29
      어떤 한 필드의 값의 정보를 다른테이블에 있는것과 비교해서 필요한 필드를 가져오는 것입니다. 예를 ...
    • 호현수
    • 2002.10.20 09:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김태훈
      2002.11.22 07:23
      공유기 같은 걸로 물린 경우 사설아이피를 할당받아서 쓰게됩니다. 클래스에 따라 할당된 아이피가 다름...
    • 타락천사
      2002.10.21 18:45
      안녕하세여. 타락임다.. 내부 IP 는 임의로 할당할 수 있습니다. 따라서 외부IP 와 같이 부여 할 수도 ...
    • 호현수
      2002.10.22 16:07
    • 타락천사
      2002.10.21 20:39
      안녕하세여. 타락임다.. 우선 다른 여러대의 컴퓨터에서 실행시켜 봅니다. 만약 델파이가 깔려 있는 컴...
    • 이영동
    • 2002.10.20 05:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이영범
      2002.10.21 19:04
      코딩으로 하는 방법은... TQuery의 AfterOpen 이벤트에 아래와 같이 써주시면 됩니다. TNumericField...
    • 정경철
      2002.10.20 21:29
      방법은 여러가지가 있겠지만 제가 주로 사용 하는 방법은 테이블을 더블 클릭 하여 표시될 필드를 선택 하...