" 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.
tthread에 synchronize에서 메인 쓰레드 동기화를 위해서
SendMessage를 부르는데요. 이것이 문제로 보이네요.
(입력동기화된 호출이 아마도 SendMessage라고 보입니다.)
비록 정확히 동기화는 안되겠지만 사용자 정의 메시지를 사용해서
PostMessage 로 처리하는 것이 맞겠습니다.
주의 할점은 PostMessage시에 사용할 데이터를 잘관리하셔야
정보를 잃어버리는 경우가 없겠습니다.
저라면 PostMessage시에 동적 메모리를 할당해서 내용을 넣고
그 내용을 wparam이나 lparam에 넣고
사용자 메시지 처리부분에서 메모리 해제를 하는 방법을
사용할것 같습니다.
자세한 것은 thread처리에 대한 부분을 알아보시길 바랍니다.