首页
社区
课程
招聘
[求助]Windows核心编程都翻烂了都半知半解的多线程,附带工程。代码:delphi
发表于: 2017-6-9 11:14 3804

[求助]Windows核心编程都翻烂了都半知半解的多线程,附带工程。代码:delphi

2017-6-9 11:14
3804

创建三个线程,sendmessage发送消息,通知form的接收消息,form接收消息后,刷新form里的listview组件内容 

代码里有三个位置加了临界区的注释

位置一是在接受消息处理的函数内

位置二是senddata的函数内部

位置三是sendata的函数外部

我在实践中发现,只有单独在位置三中加临界区,才能正常的使vcl组件刷新

位置一和位置都单独加临界都会报错

报错的位置如下:

我想问的问题是

1、为什么在位置三中加临界有效,但是在位置二中不可以呢?




[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 45
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在线等,我感觉我快差不多了!
2017-6-9 11:51
0
雪    币: 45
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
搞了半天还是没明白,继续研究
2017-6-9 15:45
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
不清楚原理,  过去使用Delphi的时候,使用新开线程操作界面过快也经常出错,  不过我比较懒,遇到这种就使用time组件,把循环操作界面数据的代码放里面,让delphi的主界面线程自己去刷新。
2017-6-10 22:34
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

procedure  aa;  stdcall;
var
    i:  integer;
begin
    i  :=  0;
    while  True  do
    begin
        //位置三
        //临界区加在这里
        EnterCriticalSection(CS3);
        form1.SendData(form1.Handle,  '刷新数据'  +  '#'  +  inttostr(1)  +  '#'  +  inttostr(i  +
            1)  +  '#'  +  inttostr(i  +  2)  +  '#'  +  inttostr(i  +  3)  +  '#'  +  inttostr(i  +  4)
            +  '#'  +  inttostr(i  +  5));

        leaveCriticalSection(CS3);
            Inc(i);
        Sleep(constsleep);
    end;
end;

procedure  bb;  stdcall;
var
    i:  integer;
begin
    i  :=  0;
    while  True  do
    begin
        //临界区加在这里
        EnterCriticalSection(CS3);
        form1.SendData(form1.Handle,  '刷新数据'  +  '#'  +  inttostr(2)  +  '#'  +  inttostr(i  +
            1)  +  '#'  +  inttostr(i  +  2)  +  '#'  +  inttostr(i  +  3)  +  '#'  +  inttostr(i  +  4)
            +  '#'  +  inttostr(i  +  5));

        leaveCriticalSection(CS3);
                  Inc(i);
        Sleep(constsleep);
    end;

end;  其它地方不用加上临界区 信我保平安 呵呵 因为从位置3就开始调用主线程的东西了 所以要同步一下

2017-7-7 17:42
0
游客
登录 | 注册 方可回帖
返回
//