第三方控件(OCX)多线程如何实例化,用了background组件

luoli52 2010-05-05 09:11:37
在主窗口上的一个按钮,点击以后跳出loading窗口(提示文件正在创件),用background的dowork实例化子窗口,该子窗口包含Load函数包含有dsoframer.ocx word文档的第三方控件,运行报异常,不是单线程,无法实例化控件

代码如下:
private DocWaitingForm form2;
private DocPreview form1;

private void btDeditMakeFile_Click(object sender, EventArgs e)
{
bgwFileMaking.RunWorkerAsync();
form2 = new DocWaitingForm();
form2.Show();
}

private void bgwFileMaking_DoWork(object sender, DoWorkEventArgs e)
{
string a = “weqwefq”;//一些参数
form1 = new DocPreview(a);
form1.Show();
}

private void bgwFileMaking_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
form2.Close();
}

DocPreview 类的load函数
private void DocPreview_Load(object sender, EventArgs e)
{
this.axFCPreviewform.Open(this.Path);
}

this.axFCPreviewform = new AxDSOFramer.AxFramerControl();控件直接以视图方式拉入了窗体,DocPreview.designer.cs文件报错



网上百度过,找不到好办法,望各位高手指导指导
...全文
354 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoli52 2010-05-06
  • 打赏
  • 举报
回复
TO zzx509

受教了 感谢你教的show()与ShowDialog()


谢谢两位,收获不小,非常感谢!
zzx509 2010-05-06
  • 打赏
  • 举报
回复
先要确认AxDSOFramer.AxFramerControl这个控件能否在主线程正常显示?
如果可以正常加载,上面的错误应该是不能在子线程中创建控件,那么反过来,
将loading窗体放在子线程中,在form1.Shown事件中关闭loading窗体。
luoli52 2010-05-06
  • 打赏
  • 举报
回复
正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

出来这个了,我没看懂
luoli52 2010-05-06
  • 打赏
  • 举报
回复
to xingyuebuyu

bgwFileMaking是backgroundwoker的实例,backgroundwoker运行RunWorkerAsync()才会触发doworker事件,显示子窗口,然后触发RunWorkerCompleted事件,关闭loading窗口

您的意思是重新自己手动创建事件,线程设置为单线程。自己监视窗口的子窗口的出现后关闭loading窗口
zzx509 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 luoli52 的回复:]
private void bgwFileMaking_DoWork(object sender, DoWorkEventArgs e)
{
string a = “weqwefq”;//一些参数
form1 = new DocPreview(a);
form1.Show();
}
[/Quote]
改form1.Show()为ShowDialog试一试
luoli52 2010-05-05
  • 打赏
  • 举报
回复
没人,分太少?我就那么多了,自己顶起
zzx509 2010-05-05
  • 打赏
  • 举报
回复
学习了。不过在线程中form1.Show()是没有开启窗体的消息循环的,窗体应该不能显示出来。
还是ShowDialog为好。
也可以改为Application.Run(form1);但是要在form1关闭后Application.ExitThread以结束线程。
xingyuebuyu 2010-05-05
  • 打赏
  • 举报
回复
        private void bgwFileMaking_DoWork()
{
string a = “weqwefq”;//一些参数
form1 = new DocPreview(a);
form1.Show();
}

//如下方式调用,不要使用background
System.Threading.Thread tt=new System.Threading.Thread(bgwFileMaking_DoWork);
//先将线程设置为单线程单元,然后再启动
tt.SetApartmentState(System.Threading.ApartmentState.STA);
tt.Start();
luoli52 2010-05-05
  • 打赏
  • 举报
回复
子窗口显示时间过长,UI界面假死,不用多线程能咋办
zzx509 2010-05-05
  • 打赏
  • 举报
回复
那就不能用多线程方式了。
luoli52 2010-05-05
  • 打赏
  • 举报
回复
to zzx509

没有用,依旧异常 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“00460182-9e5e-11d5-b7c8-b8269041dd57”
designer.cs文件的
private void InitializeComponent()
{
this.axFCPreviewform = new AxDSOFramer.AxFramerControl();
}

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧