该死的Application.ProcessMessage!悬赏最高500分获得解决此方案。(100分)

  • 主题发起人 主题发起人 tomyang
  • 开始时间 开始时间
to fatbaby:
sorry!由于原来的程序比较的复杂,为了简化,因此没有贴出来。您发现的是贴的一个纰漏
sorry again.修改ID2为空应当是在while的后面,而不是在循环体内。

同样的sorry to winnt,你首先提出,而我没有意识到。下面是实际的源码:

function TSocket.QuestService( aTxt:string;var aReturn:string):integer;
var
sId:string;
sTxt:string;
pstruSocket:pstruSocketContent;
iSocketIndex:longint;

// ThreadWait:TThreadWait;
begin

//如果没有连接,进行连接
if not(CSocket.Active) then
CSocket.Active := true;
while not(CSocket.Active) do
begin
Application.ProcessMessages;
end;

sId := rightstring('********' + inttostr(QuestTimesCount+1),8); //生成ID1

//inc Counter and generate id,like Sequence in Oracle
IncQuestTimes(); //不要管他,功能是inc(QuestTimesCount)

sTxt := sId + aTxt; //发出

//保存发出的socket记录,在client接收事件中写SocketReceive,并为socketsReceiveBuf
//赋值。
new(pstruSocket);
pstruSocket^.SocketId := sId;
pstruSocket^.SocketSend := sTxt;
pstruSocket^.SocketReceive := '';
SocketsWaiting.Add(pstruSocket);

CSocket.Socket.SendText(sTxt); //clientSocket发送Socket

while socketsReceiveBuf <> sid do //等待接收
application.ProcessMessages ;

// EvnRead.ResetEvent ; //用事件等待,但是Waitfor不释放主线程,不成功)
// if EvnRead.WaitFor(300000)=wrSignaled then

// ThreadWait := TThreadWait.create(sid); //同样Thread.waitfor一样不释放主线程,还要processMessage.
// while not(threadWait.fExeFinish) do
// begin
// application.ProcessMessages ;
// end;
// threadwait.free();
// threadWait := nil;


socketsReceiveBuf := '' ; //相当与id2:=''

//获得返回的数据,赋给aReturn
iSocketIndex := getWaitingSocket(pstruSocket^.SocketId);
if iSocketIndex >= 0 then
begin
aReturn := pstruSocketContent(SocketsWaiting.items[iSocketIndex]).SocketReceive;
aReturn := midstring(aReturn , 9,length(aReturn)-8);
end;

result := 1;

end;

//接收事件:
procedure TSocket.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
var
sReceive:string;
sid:string;
sIndex:longint;
p:pstruSocketContent;
begin

sReceive:=Socket.ReceiveText;
sid :=leftstring(sReceive,8);
CSocket.Socket.SendText(sid+'receive');//不要管此句

//CSocket.Socket.Lock;
//等待上此对SocketsReceivebuf的处理
while SocketsReceivebuf<> '' do
application.ProcessMessages ;

//收到Server的回应
SocketsReceivebuf := 'locked';
sIndex:=GetWaitingSocket(sid);
p := pstruSocketContent(SocketsWaiting.Items[sIndex]);
p^.SocketReceive := sReceive;

socketsReceivebuf := sid;

CSocket.Socket.SendText(sid+'finish'); //不要管此句
//CSocket.Socket.Unlock ;

//EvnRead.SetEvent;
end;


help!h......
 
>>首先在fun1中完成sendtext后需要等回应,在等待的过程中必须释放delphi的主进程以
确认clientsocket的事件能够被触发...

我看啊看,看啊看。。。

问题就在这里,你只管sendtext即可,对方有信息来,会触发事件OnClientSocketRead,
根本就不需要在哪个函数里等待。也和线程无关--单独的进程就可以满足你的要求了。

把问题高复杂了。
 
to sanrex:
老兄的话非常的有见地!但是我想编写一个可以在asp中调用的函数。在一个函数中完成
client send-client receive.因此需要等待。我不希望在asp里头写这样的函数:

funSendText();
while flagReceive
wait
wend;
strReceive=funReceiveText();

老板虽然没有逼我,但是我写的接口是要给其他人用的,我不希望别人骂我。

^_^,话说回来,通过这个程序,我对DELPHI的了解又加深了。
虽然还是菜鸟,但不是那么绿了!
 
Sorry:实际上我提的问题并不是问题。如果用BUTTON触发fun1,很简单不能实现。因为只有
一个主线程,第二次对fun1的调用将第一次的调用冲掉了。如果在ASP中调用FUN1则不同。
可能是因为在asp中调用相当于fun1在不同的进程中被调用,两次调用均可以正常的执行结束
多谢大家的热心帮助。分既然已经收不回来了就发出去吧。可惜分少人多
但是遗憾的是500分我自己留着了^_^ 再次感谢大家
 
后退
顶部