Q&A

  • 입력동기화된호출이...라는 에러 처리는 어떻게 하나요?
  " class EolesysError wih message '응용프로그램이 입력 동기화된 호출을 전달하고 있으므로 나가는 호출을 할수 없습니다.' process stopped use stepor run to continue. "

라는 메세지는 어떻게 처리를 해야 하는지..

발생 원인은 RS232로 입력을 계속 받고 있는 과정에서 서버로 자료를 올릴때 ClientDataSet1.Open 를 하면 Open을 하면서 이러한 메세지가 발생을 하는데 처리는 어떻게 하는지 알수가 없습니다.  

원래 동시에 자료를 보낼수 없다는 말인지 어떻게 해야 하나요?

소스는 다음과 같습니다... 고수님의 한수를 부탁드립니다.



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  CPort, StdCtrls, Db, DBTables, ComCtrls, DBClient, MConnect, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo2: TMemo;
    Memo3: TMemo;
    basesql: TQuery;
    Memo4: TMemo;
    DateTimePicker1: TDateTimePicker;
    DCOMConnection1: TDCOMConnection;
    ClientDataSet1: TClientDataSet;
    Memosql: TMemo;
    ComPort1: TComPort;
    Button4: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure datareceivetoarray;
    procedure dayreturn;
    procedure FormShow(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  dayReturn_real : string;
  TpublicRno : integer;

implementation

{$R *.DFM}

procedure Tform1.datareceivetoarray;
var loop,new_rno : integer;
    sDate,sID,WBC,RBC,HGB,HCT,MCV,MCH,MCHC,PLT,LY1,LY2 : string;
begin
   for loop:=1 to length(memo4.text) do begin
       if TRIM(copy(memo4.text,loop,4)) = 'TEST' then begin  
          sID:=TRIM(copy(memo4.text,loop+8,3));
       end;
       if TRIM(copy(memo4.text,loop,4)) = 'DATE' then begin
          sDate:=TRIM(copy(memo4.text,loop+7,9));
       end;

   end;

   clientdataset1.Close;
   memosql.Clear;
   memosql.Lines.Add('select max(rno) mRno from data');
   clientdataset1.DataRequest(memosql.lines.text);
   clientdataset1.open;    <------여기에서 위에서 서술한 에러가 발생한다.
   with clientdataset1 do
   begin
     new_Rno:=Fieldbyname('mRNO').Asinteger+1;
   end;

   memosql.Clear;
   memosql.Lines.Add('insert into T540');
   memosql.Lines.Add('(NNO,NDATE)');
   memosql.Lines.Add(' values');
   memosql.Lines.Add('('+''''+sID+''''+','+''''+sDate+''''+')');
   DCOMConnection1.AppServer.execsql(memosql.text);

end;


procedure TForm1.FormShow(Sender: TObject);
begin
  comport1.Connected:=true;
end;


procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);  //RS232C PORT를 이용해서 자료를 받는다.
var Str,str3,str4 : String;
begin
  str3:='';
  ComPort1.ReadStr(Str, Count);
  Memo2.Text := Memo2.Text + Str;

  str4:=str4+str[iii];

  memo4.Text:=memo4.text+str4;

  datareceivetoarray;   //자료를 받아서 바로 원하는 자료를 추출하는 루틴으로 보낸다.

end;

end.
3  COMMENTS
  • Profile
    이광수 2002.10.17 21:56
    Thread관련 부분에서 문제가 생기는 걸로봅니다.

    tthread에 synchronize에서 메인 쓰레드 동기화를 위해서
    SendMessage를 부르는데요. 이것이 문제로 보이네요.
    (입력동기화된 호출이 아마도 SendMessage라고 보입니다.)

    비록 정확히 동기화는 안되겠지만 사용자 정의 메시지를 사용해서
    PostMessage 로 처리하는 것이 맞겠습니다.

    주의 할점은 PostMessage시에 사용할 데이터를 잘관리하셔야
    정보를 잃어버리는 경우가 없겠습니다.

    저라면 PostMessage시에 동적 메모리를 할당해서 내용을 넣고
    그 내용을 wparam이나 lparam에 넣고
    사용자 메시지 처리부분에서 메모리 해제를 하는 방법을
    사용할것 같습니다.

    자세한 것은 thread처리에 대한 부분을 알아보시길 바랍니다.

  • Profile
    조승식 2002.10.17 22:40
    답변 감사합니다...

    그런데..초보라서 thread를 어떻게 처리 하는지 모르겠습니다.

    어디서 예제라도 알았으면 .....흑흑..
  • Profile
    이광수 2002.10.18 02:25
    제가 아는 한도에서는 아쉽게도 적당한 예제가 없어 보입니다.

    또한 저도 이해하는데 시간이 걸렸습니다.
    델파이 책말고 vc++책을 찾아 보시는 것이 나을 것이라 봅니다.