delphi多线程异步处理问题,请教大侠!!

其中有两个线程,分别处理接收数据包和处理数据包,采用异步处理。处理后的数据包用双向链表存储。单独测试,没有任何问题。处理数据包代码如下procedureTFormMain... 其中有两个线程,分别处理接收数据包和处理数据包,采用异步处理。
处理后的数据包用双向链表存储。单独测试,没有任何问题。

处理数据包代码如下
procedure TFormMain.Timer3Timer(Sender: TObject);
begin
up_arraysend();
end;

procedure TFormMain.up_arraysend();
var arraybye:array of byte;
l,n:integer;
ip,tmpbusno:string;
tmpNode:PDataPacket;
CurrentNode :PDataPacket;

begin
try
EnterCriticalSection(GlogCs);
tmpNode:=HeadNode.Next;
if Assigned(tmpNode.Next) then //´¦ÀíÍ·½áµãµÄÏÂÒ»¸ö½áµã£¬·Çβ½áµã¡£
begin
l:=tmpNode.l;
ip:=tmpNode.ip;
tmpbusno:=tmpNode.tmpbusno;
setlength(arraybye,l);
movememory(arraybye,tmpNode.arr,l);
memo1.Lines.add(uf_transtr(arraybye,0,l-1,1));
up_ansi(arraybye,ip,tmpbusno);
application.ProcessMessages;
if Assigned(HeadNode.Next.Next.Next) then //½«Á´±íÖØÁ¬£¬²¢É¾³ý¸Ã½Úµã
begin
HeadNode.Next:=HeadNode.Next.Next;
HeadNode.Next.Prev:=HeadNode;
DisPose(tmpNode);
end else
begin
HeadNode.Next:=TailNode;
HeadNode.Next.Prev:=HeadNode;
DisPose(tmpNode);
end;
end;
finally
LeaveCriticalSection(GlogCs);
end;
end;
time3的interval属性如果设置为100,没有问题
up_ansi(arraybye,ip,tmpbusno);单独测试这个函数也测试无数遍暂时没发现问题。
如果将time3的interval属性设置为10,并把up_ansi(arraybye,ip,tmpbusno);这个函数注释掉,测试暂时没发现问题。但如果interval属性为10 并把up_ansi(arraybye,ip,tmpbusno)函数加进去后,会出现内存溢出错误。错误提示看图片,请教大侠,这是什么造成的,非常感谢
展开
 我来答
jyyyjy
2012-02-20 · 超过17用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:51.5万
展开全部
和我刚开始一个错误理解,临界区原理上是不可重入的,但是该死的,如果在同一个线程,好像是不合适的,如果在多个线程,就没问题,还有就是这个timer,也该死,好像导致程序不按顺序执行,我跟踪过的,因此,这个问题,如果在同一个线程之内,最好用计数器算了,别用临界区了
追问
我擦,我发现了个严重的问题,请教大侠
application.ProcessMessages;这句不是只是让系统响应一下消息么,有时候会让程序
l:=tmpNode.l;
。。。
application.ProcessMessages;
在这里死循环,把他删掉了,好像有没有问题了,咋回事啊
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式