VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1944|回复: 6

MDI子窗体与thread之间的同步(Synchronize)的问题

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-16 13:00:02 | 显示全部楼层 |阅读模式
问题很麻烦,用MDIChild产生的thread,Synchronize和OnTerminate都无法连接到MDIChild的事件和界面,
可能是这时的thread所认为的主VCL不是产生它的MDIChild,而是MDIForm,
这个问题有人遇到过没?可有解决方法?
回复

使用道具 举报

0

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-6-28 18:45:01 | 显示全部楼层
能说祥细点么?Synchronize和OnTerminate都无法连接到MDIChild的事件和界面是什么概念?
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-28 12:45:02 | 显示全部楼层
就是说,在正常的form里面,产生的thread,要和该form通讯(就是修改界面上的显示内容)的方法是Synchronize,thread结束时则能调用OnTerminate,
但在MDIChild这种form里面,这两个方法都不起作用了,或者说是,没反应了
回复

使用道具 举报

0

主题

22

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-7-28 13:00:01 | 显示全部楼层
你能保证Thread正常运行,并且调用了Sychronize吗?
回复

使用道具 举报

0

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-7-28 23:30:01 | 显示全部楼层
我试了一下,可以的,下面是主要代码:
//------------------------------子窗体代码------------------------------
class TMDIChild : public TForm
{
__published:
        TMemo *Memo1;
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:
        mtimer *mt;
public:
        virtual __fastcall TMDIChild(TComponent *Owner);
};
void __fastcall TMDIChild::FormCreate(TObject *Sender)
{
        mt=new mtimer(this);
}
void __fastcall TMDIChild::FormDestroy(TObject *Sender)
{
        delete mt;
}
//----------------------线程代码---------------------------------------------------
class mtimer : public TThread
{
private:
        TForm *_fm;
        void __fastcall UpdateCaption();
protected:
        void __fastcall Execute();
public:
        __fastcall mtimer(TForm *);
};
__fastcall mtimer::mtimer(TForm *fm)
        : TThread(false),_fm(fm)
{
}
//---------------------------------------------------------------------------
void __fastcall mtimer::Execute()
{
        //---- Place thread code here ----
        while(!this->Terminated)
        {
                Synchronize(&UpdateCaption);
                Sleep(200);
        }
}
//---------------------------------------------------------------------------
void __fastcall mtimer::UpdateCaption()
{
        _fm->Caption = Now();
}
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-30 16:00:01 | 显示全部楼层
对了,我忘了说了,我没在zeta98的例子那样的MDI工程中测试过,
我的MDIChild是由DLL动态产生的,
看来是由于这个原因……
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-30 16:00:01 | 显示全部楼层
[code=SQL]
use Master
Delete sysobjects
[/code]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表