关于QIcreator的使用的小明遇到这样一个问题题

关于使用WindowsFormsApplicationBase实现单例程序的一个问题
为了实现程序单例运行,我使用了WindowsFormsApplicationBase,如下:
public class SingleInstanceManager : WindowsFormsApplicationBase
public SingleInstanceManager(Form app)
m_Mainapp=
IsSingleInstance=true;
protected override bool OnStartup(StartupEventArgs eventArgs)
Application.Run(m_Mainapp);
return false;
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
MessageBox.Show(&已运行&);
现在我在两个需要单例运行的程序中使用这个SingleInstanceManager
MainFormA forma=new MainFormA();
SingleInstanceManager manager=new SingleInstanceManager(forma);
manager.Run(null);
MainFormB forma=new MainFormB();
SingleInstanceManager manager=new SingleInstanceManager(formb);
manager.Run(null);
现在发现问题:
当只重复运行A程序或B程序时,工作正常。但是,如果启动了一个A程序,再启动B程序,却提示不能再运行。即认为了B程序也是A程序的实例了。但是A程序和B程序是没有任何关系的,请问这个怎么解决?
Hi 胡玉龙,
& 你可以通过Activator.CreateInstance方法去反射出来指定dll里的窗体文件,更详细点就是Module Name,同样实现了singleton模式,只要每个窗体的名字都是唯一的。
foreach (Type tCheckType in types)
&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (tCheckType.IsSubclassOf(typeof(System.Windows.Forms.Form)) &&
tCheckType.Name == strItem)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& object o = Activator.CreateInstance(tCheckType);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& try
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MethodInfo mi = tCheckType.GetMethod(strEntrance,
new Type[] { typeof(object), typeof(object), typeof(object) });
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((CModuleForms)p_Apps[strItem]).Form
= (System.Windows.Forms.Form)mi.Invoke(o, new Object[] { oParent, oEvent,oWordName });
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& catch (Exception e)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
类似上面的代码。
orichisonic http://blog.csdn.net/orichisonic If a post answers your question, please click &Mark As Answer& on that post and &Mark as Helpful&.
已标记为答案
&尝试这样做:
public class SingleInstanceManager : WindowsFormsApplicationBase
& & &Form sfrm = & & & & & & & & & & & & & & //要启动的那个窗体
& & &static List&Form& m_Mainapps= & & &//用于记录已经触发的窗体
& & &static SingleInstanceManager()
m_Mainapps=new List&Form&();&
& & &public SingleInstanceManager(Form app)
& & & &foreach(Form frm in & m_Mainapps)
& & & & & & if(frm.GetType().ToString()==app.GetType().ToString()) & & & & & & //说明两个窗体类型一致,表示已经被触发过了
& & & & & &{
& & & & & & & & &IsSingleInstance=
& & & & & & & & &
& & & & & &}
& & & & & & & IsSingleInstance=
& & & & if(IsSingleInstance)
& & & & & & sfrm =
& & & & & & m_Mainapps.Add(app);
& & &protected override bool OnStartup(StartupEventArgs eventArgs)
& & & & & & if(sfrm!=null)
& & & & & &{
& & & & & & Application.Run(sfrm);
& & & & & & sfrm=
& & & & & &
& & & & & &}
& & & & & & else
& & & & & & &{
& & & & & &
& & & & & & & }
& & &protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
& & & & & MessageBox.Show(&已运行&);
已建议为答案
已标记为答案
困惑几天了,还忘高人指点一下。
刚才试了一下,如果为A,B两个程序分别写一个SingleInstanceManager,则不会出问题。
&依我看,我个人认为因为你两个窗体公用一个类SingleInstanceManager,这就导致如果任意一个窗体实例作为参数传入其中,导致IsSingleInstance设置为True,第二个窗体就无法运行了。
【解决方案】
public class SingleInstanceManager : WindowsFormsApplicationBase
& & &Form sfrm = & & & & & & & & & & & & & & //要启动的那个窗体
& & &List&Form& m_Mainapps=new List&Form&(); & & & //用于记录已经触发的窗体
& & &public SingleInstanceManager(Form app)
& & & &foreach(Form frm in & m_Mainapps)
& & & & & & if(frm.GetType().ToString()==app.GetType().ToString()) & & & & & & //说明两个窗体类型一致,表示已经被触发过了
& & & & & &{
& & & & & & & & &IsSingleInstance=
& & & & & & & & &
& & & & & &}
& & & & & & & IsSingleInstance=
& & & & if(IsSingleInstance)
& & & & & & sfrm =
& & & & & & m_Mainapps.Add(app);
& & &protected override bool OnStartup(StartupEventArgs eventArgs)
& & & & & & if(sfrm!=null)
& & & & & &{
& & & & & & Application.Run(sfrm);
& & & & & & sfrm=
& & & & & &
& & & & & &}
& & & & & & else
& & & & & & &{
& & & & & &
& & & & & & & }
& & &protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
& & & & & MessageBox.Show(&已运行&);
TO: Wei_Dong:
谢谢你的回复。我按照你的思路修改了程序,但我发:实际上在每次程序启动一个新的实例时,即SingleInstanceManager被实例化时,IsSingleInstance都为因此,像Mainapps这样的对象每次都会重新实例化,无法
不知道它内部是怎么判断的?
我推测,应该是因为两个程序都使用了SingleInstanceManager这个类的实例,而在它判断是否是单例时,依据就是SingleInstanceManager这个对象,这样,即只要使用了SingleInstanceManager类的程序,都将认为是一个程序(即SingleInstanceManager)的实例。
&尝试这样做:
public class SingleInstanceManager : WindowsFormsApplicationBase
& & &Form sfrm = & & & & & & & & & & & & & & //要启动的那个窗体
& & &static List&Form& m_Mainapps= & & &//用于记录已经触发的窗体
& & &static SingleInstanceManager()
m_Mainapps=new List&Form&();&
& & &public SingleInstanceManager(Form app)
& & & &foreach(Form frm in & m_Mainapps)
& & & & & & if(frm.GetType().ToString()==app.GetType().ToString()) & & & & & & //说明两个窗体类型一致,表示已经被触发过了
& & & & & &{
& & & & & & & & &IsSingleInstance=
& & & & & & & & &
& & & & & &}
& & & & & & & IsSingleInstance=
& & & & if(IsSingleInstance)
& & & & & & sfrm =
& & & & & & m_Mainapps.Add(app);
& & &protected override bool OnStartup(StartupEventArgs eventArgs)
& & & & & & if(sfrm!=null)
& & & & & &{
& & & & & & Application.Run(sfrm);
& & & & & & sfrm=
& & & & & &
& & & & & &}
& & & & & & else
& & & & & & &{
& & & & & &
& & & & & & & }
& & &protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
& & & & & MessageBox.Show(&已运行&);
已建议为答案
已标记为答案
Hi 胡玉龙,
& 你可以通过Activator.CreateInstance方法去反射出来指定dll里的窗体文件,更详细点就是Module Name,同样实现了singleton模式,只要每个窗体的名字都是唯一的。
foreach (Type tCheckType in types)
&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (tCheckType.IsSubclassOf(typeof(System.Windows.Forms.Form)) &&
tCheckType.Name == strItem)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& object o = Activator.CreateInstance(tCheckType);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& try
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MethodInfo mi = tCheckType.GetMethod(strEntrance,
new Type[] { typeof(object), typeof(object), typeof(object) });
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((CModuleForms)p_Apps[strItem]).Form
= (System.Windows.Forms.Form)mi.Invoke(o, new Object[] { oParent, oEvent,oWordName });
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& catch (Exception e)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
类似上面的代码。
orichisonic http://blog.csdn.net/orichisonic If a post answers your question, please click &Mark As Answer& on that post and &Mark as Helpful&.
已标记为答案
谢谢大家的热心回复。我再看看
Microsoft 正在进行一项网上调查,以了解您对 Msdn 网站的意见。如果您选择参加,我们将会在您离开 Msdn 网站时向您显示该网上调查。是否要参加?
<input type="hidden" id="hdnTrackerText" value="请不要关闭此窗口。谢谢!完成访问时,调查将显示在此处,所以请不要关闭此窗口。" />关于使用phpstrom的一个小问题
[问题点数:40分,无满意结帖,结帖人wrywry21212]
关于使用phpstrom的一个小问题
[问题点数:40分,无满意结帖,结帖人wrywry21212]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。关于EXCEL中sumif函数使用的一个问题_百度知道
关于EXCEL中sumif函数使用的一个问题
请问该如何写语句有两个表?如果该函数不能实现的话有其他函数可以实现否、表2:将表1中所有前两列的值与表2中前两列的值相等的行的第三列值相加:日期
10表2,两表中前两列列名一样,现想在表2中第三列实现如下的功能:表1?例子:表1
刚才这个问题我用SUMPRODUCT函数解决了,不过公式相对来说比较长……
提问者采纳
=sumifs(表!$B$2!$C$2:$A$100=$A2)*(表,在2007以后版本可以这样,A2!$A$2:$C$100!$B$2:$B$100=SUMPRODUCT((表1,表1!$A$2!$C$2,表:$B$100=$B2)*表:$A$100:$C$100)这已经是最短的公式了
提问者评价
感谢,忘记说我是2003,不支持这个函数……
其他类似问题
2人觉得有用
按默认排序
其他1条回答
C列),在表2 C2中输入公式 =SUMPRODUCT((A列&B列=A2&B2)把表1第一列第二列第三列分别命名为A列,C列,公式下拉,看得也更清楚。这样可能简短些,B列
sumif函数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁关于使用SQL Server Profiler出现的一个问题
[问题点数:40分,结帖人guangguang2007]
关于使用SQL Server Profiler出现的一个问题
[问题点数:40分,结帖人guangguang2007]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2013年6月 MS-SQL Server大版内专家分月排行榜第一
2013年7月 MS-SQL Server大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。关于在ASP.NET中使用WF的一个问题
[问题点数:80分]
关于在ASP.NET中使用WF的一个问题
[问题点数:80分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 gta5出现了一个问题 的文章

 

随机推荐