社区
C#
帖子详情
子线程可以控制主线程中的控件的状态吗
jason_mf
2006-10-25 04:51:04
我用一个子线程A检查另外另外2个子线程是否结束,
结束就在线程A中显示一个MessageBox,点击MessageBox的确定
按钮就要在主线程的StatusBar上Remove一个Panel,该怎么写?
...全文
222
3
打赏
收藏
子线程可以控制主线程中的控件的状态吗
我用一个子线程A检查另外另外2个子线程是否结束, 结束就在线程A中显示一个MessageBox,点击MessageBox的确定 按钮就要在主线程的StatusBar上Remove一个Panel,该怎么写?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
3 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
打赏红包
Knight94
2006-10-25
打赏
举报
回复
我总觉得是你写得有问题,至于如何修改,你可以参考我前面介绍的文章。
jason_mf
2006-10-25
打赏
举报
回复
to Knight94(愚翁)
请教
=======================
private delegate void degCheckEnd(Janus.Windows.UI.StatusBar.UIStatusBar statusBar);
private void CheckEndThread()
{
degCheckEnd degCE = new degCheckEnd(CheckEnd);
this.Invoke(degCE, new object[] { this.uiStatusBar1 });
}
private void CheckEnd(Janus.Windows.UI.StatusBar.UIStatusBar statusBar)
{
bool isEnd = false;
do{
Thread.Sleep(100);
isEnd = false;
//threadArray保存需检查的子线呈
foreach (Thread th in this.threadArray)
{
if (th.ThreadState != System.Threading.ThreadState.Stopped)
{
isEnd = true;
}
}
if (isEnd == false)
{
if (MessageBox.Show("检查的子线程结束", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
{
statusBar.Panels.RemoveAt(2);
}
}
} while (isEnd);
}
Thread thEnd = new Thread(CheckEndThread);
thEnd.Start();
我这样写,需检查的子线程好像就一直不结束,
写成下面的,子线程就会结束,但就不能控制ui线呈了。
//private delegate void degCheckEnd(Janus.Windows.UI.StatusBar.UIStatusBar statusBar);
//private void CheckEndThread()
//{
// degCheckEnd degCE = new degCheckEnd(CheckEnd);
// this.Invoke(degCE, new object[] { this.uiStatusBar1 });
//}
private void CheckEnd()
{
bool isEnd = false;
do
{
Thread.Sleep(100);
isEnd = false;
foreach (Thread th in this.threadArray)
{
if (th.ThreadState != System.Threading.ThreadState.Stopped)
{
isEnd = true;
}
}
if (isEnd == false)
{
if (MessageBox.Show("检查的子线程结束", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
{
//statusBar.Panels.RemoveAt(2);
}
}
} while (isEnd);
}
Thread thEnd = new Thread(CheckEnd);
thEnd.Start();
Knight94
2006-10-25
打赏
举报
回复
子线程无法直接操作,需要用Invoke或者BeginInvoke来控制UI线程。
参看
http://blog.csdn.net/Knight94/archive/2006/08/24/1111267.aspx
相关推荐
Winform 通过Invoke改变UI
在Winfrom 程序
中
如果直接在
子
线程
中
更新
主
线程
的UI会触发如下
线程
间操作无效异常。 异常如下图所示: 这是因为
控件
是在
主
线程
中
创建的,在
子
线程
中
改变
控件
状态
可能会与
主
线程
发生冲突。如果
主
线程
正在重绘
控件
外观,而此时
子
线程
要改变
控件
状态
则会造成画面混乱。 解决方案 使用Invoke, Invoke方法会顺着
控件
树向上搜索直到找到创建
控件
的那个
线程
(通常是
主
线程
),然后进入那个
线程
改...
子
线程
回调
主
线程
后
控制
控件
~
子
线程
回调
主
线程
后
控制
控件
: 除了用反射机制,还有什么好方法吗? void LogonSuccess(ConnectStruct connect) { if (this._logOnView.InvokeRequired) { LogonSuccessCallBack logonSuccessCallBack =
Python GUI库TKinter
子
线程
与
主
线程
控件
传递消息策略
TKinter GUI库没有像MFC那样的强制安全策略,在MFC
中
子
线程
无法直接
控制
主
线程
中
的GUI
控件
,比如修改文本框或者按钮上的内容。因为如果只有2个
线程
,即一个
主
线程
和一个
子
线程
的情况下
子
线程
直接修改
主
线程
控件
的相关变量是没什么问题的,也不会出错,但是如果
子
线程
个数大于1,就可能会出现多个
线程
同时修改一个
控件
相关变量的情况,导致混乱出错。所以MFC
中
的办法是自定义一个消息,然后
子
线程
调用这个自定义的消息给
主
线程
发送消息,再由
主
线程
选择相应或者不相应,这样选择权就在
主
线程
,因而可以避免出错。但是Pyth
使用Handler在
线程
之间传递消息所遇到的问题及解决方法
目的是这样的:
线程
A实现录像功能,所要进行的操作是网络连接与录像存储,并且在录像过程
中
需要与
主
线程
,即UI
线程
进行交互,然后
线程
A根据UI
线程
中
的响应结果进行下一步处理。简单来说就是
主
线程
与
子
线程
相互传递信息,并且
主
线程
会通过所传递的信息
控制
子
线程
的操作。 相互之间传递信息不是难点,难点是
主
线程
要通过传递信息来
控制
子
线程
的操作,我们都知道,
子
线程
的执行不依赖于
主
线程
,当我们把
子
线程
中
的
状态
信息传
C#
子
线程
使用
主
线程
中
的
控件
问题
C#
子
线程
使用
主
线程
中
的
控件
问题 需使用委托
主
线程
中
public delegate void increase(); private void progressBarAdd() { progressBar1.Value++; }
子
线程
若要使用
主
线程
中
的progressBar1 progressBar1.Invoke(new in
发帖
C#
C#
.NET技术 C#
复制链接
扫一扫
10.8w+
社区成员
64.2w+
社区内容
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
帖子事件
创建了帖子
2006-10-25 04:51
社区公告
让您成为最强悍的C#开发者