Q&A

  • 쓰레드 전역 변수 값 변경 되는 증상
type
  TEventTherad = class(TThread)
  private
  protected
    procedure Execute; override;
  public
    ATUrl, ATDeviceId, ATToken, ATStoreCd, ATEventType, ATEventNm, ATTime: PChar;
  end;
이렇게 쓰레드를 선언하고 쓰레드 내에서 값을 사용하기위해  PUBLIC 으로 변수를 선언해서
쓰레드 실행하기 전에
PUBLIC 변수에 값을 할당합니다.
ATUrl := 'www.aaa.kr';  이렇게 할당하고
쓰레드를 실행해서
디버깅해보면 ATUrl 값이  'www.aaa.k$'  이런식으로 값이 변함니다.
쓰레드에 값을 넘겨 사용하는 방법은 없는 건지요
사용 버전은 델파이 7 이구요  델파이 XE 에서는 만들어 보니 값이 변하는 증상 없이 잘동작합니다.
델파이 7 이 문제내요
아시는 분은 답변좀 부탁드리겠습니다.
3  COMMENTS
  • Profile
    이정욱 2015.03.19 08:44

    값을 할 당 하시는 부분이 어느 부분이신지요...?

    그냥 따옴표로 묶어서 하시는것인지, 아니면 변수를 넣는 것인지요..?

  • Profile
    jin 2015.03.19 18:06
    소스는 아래와 같습니다. 스레드를 사용하지 않으면 잘되는데 스레드를 사용하면 변수 값이 변경됩니다.
    procedure TForm1.Button4Click(Sender: TObject);
    var
      AThread : TEventRunTherad;
      sTime, sEventNm, AEventType: string;
    begin
      AEventType := cbotype.Text;

      AThread := TEventRunTherad.Create(True);
      AThread.ATUrl        := PChar(Trim(edtUrl.Text));
      AThread.ATDeviceId   := PChar(Trim(edtDeviceId.Text));
      AThread.ATToken      := PChar(Trim(edtToken.Text));
      AThread.ATStoreCd    := PChar(Trim(edtStorecd.Text));
      AThread.ATEventType  := PChar(AEventType);

      AThread.Resume;
    end;

    { TEventRunTherad }

    procedure TEventRunTherad.Execute;
    type
      TGageEventAdd=function(AUrl, ADeviceId, AToken, AStoreCd, AEventType: PChar): PAnsiChar; stdcall;
    var
      GageEventAdd: TGageEventAdd;
      HNtdll: Cardinal;
      sTmp: string;
    begin
     
      HNtdll := LoadLibrary('Gage119.DLL');
      if(HNtdll = 0) then
      begin
        ShowMessage('DLL을 찾을 수 없습니다.');
        Self.Terminate;
        Self.Free;
        exit;
      end;
      GageEventAdd:=GetProcAddress(HNtdll,'GageEventAdd');
      sTmp := GageEventAdd(ATUrl, ATDeviceId, ATToken, ATStoreCd, ATEventType );
      if sTmp = 'false' then
      begin
        showmessage('이벤트등록 실패');
        sTmp := GageEventAdd(ATUrl, ATDeviceId, ATToken, ATStoreCd, ATEventType );
        if sTmp = 'false' then
        begin
          showmessage('이벤트등록 실패');
        end
        else
        begin
          showmessage('이벤트등록 성공');
        end;
      end
      else
      begin
        showmessage(sTmp);
        showmessage('이벤트등록 성공');
      end;
      Self.Terminate;
      Self.Free;

      inherited;
    end;
  • Profile
    이정욱 2015.03.20 03:15

    음... 이상하네요. 저는 델파이 2007을 사용하는데 변수값이 변경되지 않고 잘 넘어 옵니다...

    언어적으로는 델파이 7과 2007의 차이는 거의 없다고 보시면 되는데요..



    • 민환민준빠
      2015.07.02 18:44
      자체 해결 Panel 이 문제네여 .. -_-;;;
    • 바람순이
      2015.06.10 23:38
      Mozilla Firefox(35.0.1)에서 글 및 댓글을 달았습니다.
    • JangHeeJin
    • 2015.06.03 03:48
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.06.03 12:01
      http://codeverge.com/embarcadero.delphi.general/better-code-for-writing-reading-th/1067762 를 참고해...
    • JangHeeJin
      2015.06.04 01:21
      답변감사합니다 저기 나오는 함수들중 아무거나 사용해도 무관한건가요? 비슷한 함수 들이 많은거같...
    • 이정욱
      2015.06.04 03:45
      시도해보시는것이 기술을 가장 빨리 습득하는 방법입니다.
    • JangHeeJin
      2015.06.05 02:50
      485방식으로 읽으니 이런식으로 데이터가 올라오는데 왜 그런건가요?
    • 이정욱
      2015.06.06 01:16
      소스를 봐야 알 수 있을 듯 합니다. 참고로 시리얼 통신에서는 맞춰줘야할 것들이 있습니다. 컴포넌트로 ...
    • 바람순이
      2015.06.10 23:52
      리더기에서 순수하게 RF-Card 데이터만 넘어오는것이 아니고 Header도 같이 넘어옵니다. 그리고 데이터는 ...
    • 바람순이
      2015.06.10 23:59
      procedure Tform1.VaCommRxChar(Sender: TObject; Count: Integer);var rChr: Char;    Cnt: integer;    s...
    • 이정욱
      2015.05.29 10:20
      Delphi 2010 이 최신 업데이트까지 다 입혀진 상태여야 합니다. 한번 확인해 보세요~
    • 이정욱
      2015.05.26 18:08
      LinePen.Width 속성을 이용해 보세요~
    • 난이화
      2015.05.27 15:06
      답변 감사 합니다. 그러나 Chart1.Series[30].LinePan.width 나 Chart1.SeriesList[1].LinePan.Width ...
    • 이정욱
      2015.05.27 21:38
      (Chart1[0] as TLineSeries).LinePen.Width := 4;  이런식으로 한번 사용해 보세요~
    • 난이화
      2016.10.20 02:20
      답변이 아주 늦어 죄송합니다.  감사 합니다.
    • 이정욱
      2015.05.23 09:16
      http://www.devtools.co.kr/m_mall_detail.php?ps_goid=125&ps_goid=125 을 이용하시면 되실 듯 ...
    • ULP
    • 2015.05.05 22:49
    • 2 COMMENTS
    • /
    • 0 LIKES
    • ULP
      2015.05.05 23:07
      var  F : TFileStream;  buf : Array of Char;begin  F := TFileStream.Create('파일 명',fmOpenRead);  tr...
    • 이정욱
      2015.05.06 08:52
      아.. 몰아서 넣으셨다는 뜻이 여러개의 동적배열의 크기를 미리 메모리를 확보해 놓으셔서 그러셨던것 같습...
    • 김미경
    • 2015.05.05 00:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.05.05 10:19
      TAdvStringGrid라면 TMS사의 컴포넌트인데, 꽤 전통있고 유명한 컴포넌트 죠. 특히 바로 이 그리드 때문에...
    • 이정욱
      2015.04.22 09:05
      OnResize 이벤트에서 크기에 맞게 다시 그려주세요..
    • 이정욱
      2015.04.22 09:35
      Option에서 라이브러리의 Search Path 에 해당 경로를 추가해보십시오.
    • 횬이
    • 2015.03.27 02:38
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.27 09:40
      일단 DataSource 라는 개념을 이해 하시면 됩니다. TTable 이나 TQuery는 Dataset 이라는 것을 알아두시...
    • 횬이
      2015.03.27 17:42
      안녕하세요~ 설명해주셔서 감사합니다... 근데 DataSource Dataset에 TQuery로 설정을하게되면 "datasourc...
    • 이정욱
      2015.03.25 06:00
      http://blog.dummzeuch.de/2013/11/10/delphi-20052006-on-windows-8-1/  위 사이트를 참고 하시면...
    • 동키호테
      2015.03.25 18:10
      답변 감사합니다. 저도 그 링크는 보고 따라서 해봤는데, 안 되더라구요. 그래서, embarcadero 에 문의를...
    • jin
    • 2015.03.17 18:54
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.19 08:44
      값을 할 당 하시는 부분이 어느 부분이신지요...? 그냥 따옴표로 묶어서 하시는것인지, 아니면 변수를 넣...
    • jin
      2015.03.19 18:06
      소스는 아래와 같습니다. 스레드를 사용하지 않으면 잘되는데 스레드를 사용하면 변수 값이 변경됩니다.pro...
    • 이정욱
      2015.03.20 03:15
      음... 이상하네요. 저는 델파이 2007을 사용하는데 변수값이 변경되지 않고 잘 넘어 옵니다... 언어적으로...
    • 쿠로로
    • 2015.03.14 03:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2015.03.19 08:45
      그냥 Uses 절에 넣으시면 됩니다... 물론 해당 PAS파일이 버전에 맞게 잘 작성되어있다면 말이죠...
    • 쿠로로
      2015.03.23 05:07
      .pass파일의 경로는 어떻게 해야 하나요? uses절에 넣는다고 모든 경로를 검색할꺼 같지는 않습니다...
    • 이정욱
      2015.03.24 04:50
      프로젝트와 같은 경로에 있던지, 아니면 그 유닛이 있는 경로를 Option 에서 Library Search Path 에 추가...
    • 이정욱
      2015.03.04 07:11
      한글 데이터들을 유니코드로 변환해 놓으시던지, 아니면 조회 전에 한글을 안시코드로 변환 후 쿼리를 해야...
    • phono
      2015.03.03 08:09
      gdb파일이 쉽게 깨지는 파일이 아닙니다. 제 추측으론.. db를 핸들링 하실때..  db쪽에 커밋이 바로 작동...
    • 카카오톡
      2015.03.13 18:56
      감사합니다. 결국 엑셀에 있는데이터 다시 올리는  프로그램 만들어서 올렸네요 ㅎㅎ 감사해요
    • 이정욱
      2015.01.30 06:20
      Main 폼에 사용하신 ApplicationEvent 컴포넌트 라는것에서 다 먼저 가져가는것 같네요. 모달폼을 띄우기 ...
    • 윤박사
    • 2014.04.01 03:31
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 백록화
      2014.03.25 03:34
      1. 코딩중 단축키 Ctrl+Space , Ctrl+Shift+Space 로 코드컴플레이션, 툴팁 심볼 인싸이트 같은 코드 인싸...
    • gandus
      2014.03.25 06:52
      호출하는 함수에서 para3의  para2 구조체에 반환값을 줘서요
    • gandus
      2014.03.25 06:56
      C로 제작된 dll을 쓰는데, 소스로 확인해보니 c로 쓰레기값이 넘어가서...
    • 이정욱
      2014.03.25 08:14
      dll 을 호출하기 위해 선언한 부분을 알려주셔야 할 듯 합니다. cdecl 인지 stdcall 인지...
    • gandus
      2014.03.25 18:14
      Function 함수4(m_Align_Data : T_Align_Data ; var m_Align_Result : T_Align_Result) : Integer  cdecl; ...
    • 이정욱
      2014.03.26 02:37
      그 DLL의 헤더 부분 및 구조체도 알려주셔야 합니다~ 그리고 Record 를 Packed Record 로 변경해서 해보세요~
    • gandus
      2014.03.28 19:30
      LDC_ReadCalUVWPosition(LD_CAL_UVW *pStageCalUVW)LDC_WriteCalXY(LD_CAL_XY ViewL, LD_CAL_XY ViewR)LDC_...
    • • • •
  • profile jin
    2015/03/17 18:54
  • Views24
    Likes0
    Comments3
    Reports0
  • Tag List
  • 목록으로