winform 的 show 和 ShowDialog 的问题, 高分求解

jcaomao 2004-12-22 03:14:50
我的程序里面用socket异步通讯,其中数据到达的时候出了问题。

我首先定义了一个事件, 然后在主线程窗体的formload里面把自己的一个方法注册到这个事件中,然后在socket的异步通讯线程里面数据到达的时候 激活这个事件。

主线程窗体里的那个方法只是 new 了一个空窗体。

可是如果事件激活的时候,我的主窗体正用ShowDialog打开另外一个窗体, 这样那个方法里面的new出来的窗体就好像是死循环一样。 如果那个方法里面new 出来的窗体也是用 ShowDialog 方法打开的话居然不起作用,主窗体还能够访问,并且新打开的窗体里面的控件绑定都失效了。

那位大侠能救救我啊?
...全文
394 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxyPioneer 2004-12-24
  • 打赏
  • 举报
回复
up
51106354 2004-12-24
  • 打赏
  • 举报
回复
DotNetFreak() 写的不错,改一下应该就可以了,不行就获得窗体句柄做判断,或者遍历主线程上实例化的类.
ClampHammer 2004-12-24
  • 打赏
  • 举报
回复
学习了
DotNetFreak 2004-12-22
  • 打赏
  • 举报
回复
用了一个syncRoot object 来防止ShowDialog 的时候,Socket 完成了也要Show new Form, 这种情况的话,要等MessageBox 完成了, new Form 才会出现
DotNetFreak 2004-12-22
  • 打赏
  • 举报
回复
写了个例子,跟你描述的差不多,只是用Thread.Sleep(5000) 来代替了你的Socket call

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;

namespace WindowsApplication1
{
public delegate void MyHandler(string msg);

/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
public event MyHandler OnMsgArrived;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

this.OnMsgArrived += new MyHandler(Form1_OnMsgArrived);

del = new EventHandler(SimulateSocketLongOperation);
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(56, 24);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(64, 72);
this.button2.Name = "button2";
this.button2.TabIndex = 1;
this.button2.Text = "button2";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private object syncRoot = new object();
private EventHandler del;

private void Form1_OnMsgArrived(string msg)
{
lock( syncRoot )
{
this.Invoke(new MyHandler(NewFormInvoke), new object[]{msg});
}
}

private void NewFormInvoke(string msg)
{
Console.WriteLine(msg);

new Form().Show();
}

private void button1_Click(object sender, System.EventArgs e)
{
del.BeginInvoke(this,EventArgs.Empty,new AsyncCallback(CallBack), "Hello");
}

private void CallBack(IAsyncResult ar)
{
del.EndInvoke(ar);

if( OnMsgArrived!=null )
OnMsgArrived(ar.AsyncState.ToString());
}

private void SimulateSocketLongOperation(object sender, EventArgs e)
{
Thread.Sleep(5000);
}

private void button2_Click(object sender, System.EventArgs e)
{
lock( syncRoot )
{
MessageBox.Show("Show MsgBox");
}
}
}
}
xiaoslong 2004-12-22
  • 打赏
  • 举报
回复
up
egxsun 2004-12-22
  • 打赏
  • 举报
回复
对窗体主线程用公共委托:
public delegate void DDD(string returnVal);
在代码里:
sting[] args=new string[]{"11"};
DDD UIDe=new DDD(yourF);

this.Invoke(UIDe,args);
...

void yourF(string result)
{

}
luoshulin 2004-12-22
  • 打赏
  • 举报
回复
哇200分,可是我会,学习ing
jin_xiaolu2000 2004-12-22
  • 打赏
  • 举报
回复
学习ING,不是很清楚
xiaomatian 2004-12-22
  • 打赏
  • 举报
回复
学习
北京的雾霾天 2004-12-22
  • 打赏
  • 举报
回复
我觉得你的问题出在了在不同的线程里打开了窗体而使窗体的显示出现了异常的情况,你如果要在另一个线程里打开窗体,可以用this.Invoke的方法执行打开窗体的那个方法,具体你可以参见MSDN对Invoke的说明.
cendrillon 2004-12-22
  • 打赏
  • 举报
回复
没看明白,说得再具体点
fellowcheng 2004-12-22
  • 打赏
  • 举报
回复
up
kong19 2004-12-22
  • 打赏
  • 举报
回复
up
内容概要:本文围绕城市场景下的无人机三维路径规划问题,提出了一种新颖的多目标粒子群优化算法(NMOPSO),旨在解决高维复杂环境中路径规划面临的多重挑战。研究聚焦于导航变量的多目标优化,构建了一个包含路径长度、飞行安全性、能量消耗等多个相互冲突目标的优化模型,并采用改进的粒子群算法进行高效搜索,最终获得一组Pareto最优解集,为实际决策提供多样化路径选择方案。该方法结合Matlab代码实现,详细阐述了算法的设计机制、数学建模流程及仿真验证过程,充分展示了其在密集城市建筑环境中有效规避障碍物、满足飞行动力学约束并实现多目标权衡的能力,具有较强的工程应用价值。; 适合人群:具备一定优化算法理论基础和Matlab编程能力,从事无人机路径规划、智能交通系统、自动化控制、人工智能应用等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市环境中的无人机物流配送、巡检监控、应急救援等实际任务的三维路径规划;②为高维、非线性、多约束的多目标优化问题提供有效的算法设计思路与改进参考;③通过Matlab仿真平台复现算法,进一步开展性能测试、参数调优与算法对比研究,推动相关领域的技术创新。; 阅读建议:此资源强调算法原理与工程实践的深度融合,建议读者重点研读目标函数的构建方式、约束条件的处理策略以及NMOPSO算法的核心改进机制,并务必动手运行和调试所提供的Matlab代码,以深入理解算法在三维空间路径优化中的具体实现细节与实际表现。
内容概要:本文档围绕基于10机39节点的电力系统仿真展开,依托Matlab/Simulink平台构建标准电力系统模型,系统性地实现了电力系统稳态与暂态过程的仿真分析。内容涵盖潮流计算、短路故障、暂态稳定性、N-k故障分析、蓄意攻击与级联故障模拟等核心问题,并引入混合整数线性规划(MILP)等优化方法进行电网脆弱性评估与关键故障筛选。文档突出科研复现导向,整合了状态估计、虚假数据注入攻击、优化算法等前沿技术的交叉应用,具有较强的理论深度与工程实践价值。; 适合人群:具备电力系统基本理论知识和Matlab/Simulink仿真能力的研究生、科研人员及电力工程技术人员,特别适用于从事电力系统稳定性分析、安全防护、故障演化机制与优化调度等领域研究的专业人士。; 使用场景及目标:① 掌握10机39节点系统的建模方法与仿真流程;② 学习并复现电力系统典型故障(如短路、N-k故障、级联故障)的建模与动态响应分析;③ 理解基于MILP的电网脆弱性评估、攻击策略建模与故障传播机制;④ 结合优化算法开展电力系统安全防御、恢复策略与韧性提升研究。; 阅读建议:建议结合文档中标注的“顶级EI复现”“核心论文复现”等标签,重点关注模型构建逻辑与代码实现细节,优先运行仿真案例以理解其物理背景与数学建模原理,同时深入分析故障场景设定、目标函数设计及优化求解策略的工程意义与学术价值。

111,129

社区成员

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

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

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