有三个窗体:主窗体 A ,窗体 B,窗体 C ,全局委托 D
A窗体 调用 B 显示; B调用全局委托 D 获取数据,同时 打开 C 窗体显示等待
窗体A 接收到 全局委托D线程 异步发送来的 消息,用 委托异步执行 关闭 B窗体,出现 创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
请分析下 为什么会是这样,我想理解下真正的过程。。。感激不禁!!
A 窗体 接收到 全局委托 D 异步发送来的消息后调用 关闭 B窗体的代码:
DisplayTipHandle handle = new DisplayTipHandle(LoginMsg);
this.BeginInvoke(handle, "false");
9 个解决方案
#1
DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?
你这样给代码,让别人怎么帮你分析?
#2
是我考虑不全
DisplayTipHandle 是定义了一个委托;
// 委托 调用UI上的控件
private delegate void DisplayTipHandle(String tip);
LoginMsg 是一个函数,用来 关闭 窗体 B
因为 这段 代码 是写在 窗体 A 的 cs 里面的,所以 this 按照我的理解应该是 窗体 A
#3
B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。
#4
B调用全局委托 D 获取数据,这个调用 不是 在构造函数里面执行的,窗体B 是登录框,A是主函数, 窗体B 是用户点击登录了,发送全局委托去 查询数据库 并 调用 窗体 C 显示 等待。 数据库 返回的数据,我用 异步 回调全局委托 D, 这样 窗体 A 才接收到异步全局委托的数据,用 委托调用 主进程的函数 来 关闭 窗体B 程序。
#5
if( this.IsHandleCreated )
{
this.BeginInvoke(...);
}
#6
这个试过了, Handle 一直没有创建,跳不进去的
#7
既然“窗口都还没有创建”,跳进去有什么用处?
#8
是检测到都没有创建
运行过程前面也说过了
启动项: 窗口 A =>调用弹出 窗口 B=>调用全局委托 D 并且 显示 弹出 窗口 C
全局委托 D 用线程 回调, 窗口A 接收到 回来的消息, 用委托 调用 进程 关闭窗口B 时
出现 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
这个方法可能有问题,但是就是不太理解为什么不能这么回调?
#9
我在下帖的三楼有解释,3年前的帖子了:)
http://topic.csdn.net/u/20091129/23/1dae9f08-5396-421f-9c1f-0d7b4269bd7d.html
#1
DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?
你这样给代码,让别人怎么帮你分析?
#2
是我考虑不全
DisplayTipHandle 是定义了一个委托;
// 委托 调用UI上的控件
private delegate void DisplayTipHandle(String tip);
LoginMsg 是一个函数,用来 关闭 窗体 B
因为 这段 代码 是写在 窗体 A 的 cs 里面的,所以 this 按照我的理解应该是 窗体 A
#3
B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。
#4
B调用全局委托 D 获取数据,这个调用 不是 在构造函数里面执行的,窗体B 是登录框,A是主函数, 窗体B 是用户点击登录了,发送全局委托去 查询数据库 并 调用 窗体 C 显示 等待。 数据库 返回的数据,我用 异步 回调全局委托 D, 这样 窗体 A 才接收到异步全局委托的数据,用 委托调用 主进程的函数 来 关闭 窗体B 程序。
#5
if( this.IsHandleCreated )
{
this.BeginInvoke(...);
}
#6
这个试过了, Handle 一直没有创建,跳不进去的
#7
既然“窗口都还没有创建”,跳进去有什么用处?
#8
是检测到都没有创建
运行过程前面也说过了
启动项: 窗口 A =>调用弹出 窗口 B=>调用全局委托 D 并且 显示 弹出 窗口 C
全局委托 D 用线程 回调, 窗口A 接收到 回来的消息, 用委托 调用 进程 关闭窗口B 时
出现 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
这个方法可能有问题,但是就是不太理解为什么不能这么回调?
#9
我在下帖的三楼有解释,3年前的帖子了:)
http://topic.csdn.net/u/20091129/23/1dae9f08-5396-421f-9c1f-0d7b4269bd7d.html