怪事,线程中的for循环变量的值为何为乱套?(10分)

  • 主题发起人 主题发起人 Boblee
  • 开始时间 开始时间
B

Boblee

Unregistered / Unconfirmed
GUEST, unregistred user!
程序如下:
unit sendmsgThread;
interface
uses
Classes,Forms,Windows,SysUtils,Dialogs,Math;
type
TSendMsgThread = class(TThread)
Sender,Receiper,MSGString:String;
private
{ Private declarations }
protected
function splitMsgAndSendMsg(Toh,From,Msg:String):integer;
function SendMsg(Toh,From,Msg:string):integer;
procedure Execute;
override;
end;

function NetMessageBufferSend(servername:PWideChar;
MsgName:PWideChar;
FromName:PWideChar;
Buf: PWideChar;
var BufLen:integer):integer;cdecl;//定义函数
function NetMessageBufferSend;
external 'netapi32.dll' name 'NetMessageBufferSend';
implementation
uses
main;
function TSendMsgThread.splitMsgAndSendMsg(Toh,From,Msg:String):integer;
const
MESSAGE_MAX_LEN = 10;
var
ml,segNum:integer;
fl,sn:Extended;
tempStr:string;
begin
Result := 0;
segNum := 0;
fl := Length(msg) / MESSAGE_MAX_LEN;
ml := Ceil(fl) - 1;
sn := fl - ml;
for segNum:=0 to ml do
begin
if ml = segNum then
tempStr := copy(Msg,(segNum*MESSAGE_MAX_LEN + 1), Floor(sn * MESSAGE_MAX_LEN))
else
tempStr := copy(Msg,(segNum*MESSAGE_MAX_LEN + 1),MESSAGE_MAX_LEN);
[gold] Result := Result + SendMsg(Toh,From,tempStr);
//运行了这个funciton后,segNum 就变成了一个很大的值而不是
//常规的for循环那样变成 1. 如果我把这句话注掉,segNum就正常了。
//这是为什么?[/gold]
end;
end;

function TSendMsgThread.SendMsg(Toh,From,Msg:string):integer;
const
COPYTRIGHTPLAIN = #13#10+#13#10+'----========================----'+#13#10+
'Message was sended by NM Messager Explorer';
TRY_SEND_TIMERS = 3;
var
ToName :array [0..64] of WideChar;
WMsgText:array [0..1000] of WideChar;
MsgLen,i,tryNum:integer;
begin
Result := 1;
tryNum := 0;
for i := 0 to 64do
ToName := #0;
for i := Length(Msg)+1 to 1000do
WMsgText := #0;
Msg := Msg + COPYTRIGHTPLAIN;
StringToWideChar(Toh,ToName,i);
StringToWideChar(Msg,WMsgText,i);
while (tryNum < 3) and (Result <> 0)do
begin
Result := NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
inc(tryNum);
sleep(2000);
end;
end;

procedure TSendMsgThread.Execute;
var
succ:integer;
errmsg,succmsg:string;
begin
FreeOnTerminate := true;
errmsg := 'Send %s message failed!'+
#13+'Maybe %s not exist or turndo
wn his pc';
succmsg := 'Send %s message Successfully!';
try
succ := splitMsgAndSendMsg(Receiper,Sender,MSGString);
except
On E:Exceptiondo
Application.MessageBox(PChar(errmsg),'Error',MB_OK+MB_ICONERROR);
end;
if (succ <> 0) then
begin
//Application.MessageBox(PChar(errmsg),'Send Report',MB_OK+MB_ICONERROR);
mainFrm.addMSGSendError(Format(errmsg,[Receiper]))
end
else
begin
mainFrm.addMSGSendError(Format(succmsg,[Receiper]));
end;
mainFrm.decReceiverCounter;
if (mainFrm.global_reciverNum < 0) then
mainFrm.ShowSendReport;
end;

end.
问题我加在了上面的程序中。
 
粗看了一下:
1.
Result := NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
中MsgLen使用前未初始化。
2.
function NetMessageBufferSend(servername:PWideChar;
MsgName:PWideChar;
FromName:PWideChar;
Buf: PWideChar;
var BufLen:integer):integer;cdecl;//定义函数
是否确定是cdecl,还是WINAPI?
3.
StringToWideChar(Toh,ToName,i);
StringToWideChar(Msg,WMsgText,i);
中i不是循环变量,应该超出数组上限了。
可能是2影响了Stack中的值,刚好改变了Result的值。
程序中似乎还有不妥的地方,建议细看一下。
 
我是Delphi新手,NetMessageBufferSend这个也是从大富翁上找到了,看这样也能用,也就没
有去进一步研究,对于你说的:“是cdecl,还是WINAPI?”,我不懂什么是 cdecl, winapi
我知道这个东西。MsgLen我没给初值,但我看我也能发成功,所以就没去管它了,是不是给
msg 的长度。还有,其它的不妥的地方,你能指出吗?给个思路也行。
kyq,好象我有很多问题都是你帮我答的,在这里先谢过了。:)希望我也有一天能象你现这样
提供给别人帮助。:)
 
请看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1317901
 
You are welcome:)
你找到的代码有几处错漏,例如函数声明错误、线程未同步等问题,
建议看一看问题1317901的代码。
 
不管能不能用,先把分给了。不过我看也差不可以解决我的问题了.
不过,如果这个还有问题,我会继续在这个帖子上发(当然,仍是跟这个问题有关的),希望
你能继续给帮忙。:)
再次谢过了。
 
后退
顶部