|
Salam
with Add-in installation and setup information
to automatise Excel ,I can't create new NamedRange
in methode public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
or to cast Microsoft.Office.Interop.Excel.WorkSheet to
Microsoft.Office.Tools.Excel.WorkSheet
Thanks
good day for all
|
|
|
|
|
Hello,
I have a program that opens multiple user controls, each one needing to run 3 parallel processes. It needs to run all 3 simultaneously, and then when all 3 are complete run a process. This needs to occur every second.
What I have done, is create 3 threads, one main thread which when it starts running it calls two .Set() methods for manualevent handlers which then sets the other two threads running. I then have a waitall in the main thread (after the point where it has done its work) which waits for the other two threads to complete. At the end of the two threads I have a waitall which waits for a different manualevent to be reset (which happens when the main thread finishes).
Now this all seems to work fine, but when running 4 user controls at once, approximetly every minute the threads somehow get confused and one of the waitall's for the two sub threads get stuck. So I have put a timeout parameter here which is a hack, and doesn't really solve why it is locking up. I can't put all the code in but below is an example of it working.
Can anyone help come up with why this is occurring, or a better way of doing this?
//Thread Ones Run Method
public void ThreadOne()
{
while(true)
{
ogEvents[0] = new ManualResetEvent(false);
ogEvents[1] = new ManualResetEvent(false);
//Do a task here
//Wait for the other 2 threads to finish
bool blSuccess = WaitHandle.WaitAll(ogEvents, 4000, false);
//Do some calcs
Thread.Sleep(1000);
ogThreadTwo[0].Set();
ogThreadThree[0].Set();
}
}
//Thread Two's Run Method
public void ThreadTwo()
{
while(true)
{
//Do some task
//Task Finished
ogEvents[0].Set();
ogThreadTwo[0] = new ManualResetEvent(false);
bool blSuccess = WaitHandle.WaitAll(ogThreadTwo, 4000, false);
}
}
//Thread Three's Run Method
public void ThreadThree()
{
while(true)
{
//Do some task
//Task Finished
ogEvents[0].Set();
ogThreadThree[0] = new ManualResetEvent(false);
bool blSuccess = WaitHandle.WaitAll(ogThreadThree, 4000, false);
}
}
|
|
|
|
|
Hi,
why are you creating new ManualResetEvents all the time? I would create them once, and resuse them, i.a. call Set(), Reset() and Wait/WaitAll() as required, no more no less. Replacing one ManualResetEvent by another you are risking signaling or waitinf for one that isn't actually in business any more.
Whatever you do, you must allow for any or all of your threads not to get any CPU cycles at all for some time, e.g. because some high-priority thing suddenly happens.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Purely for organizational purposes, I would actually have a fourth thread controlling the other three, if possible. Threading problems can be difficult to debug, so keeping the code clean can sometimes be a big help...
Also, I would probably go with just basic EventWaitHandles
EventWaitHandle workerThreadStart[] = new EventWaitHandle[3];
EventWaitHandle workerThreadFinish[] = new EventWaitHandle[3];
while (true)
{
for (int x = 0; x < 3; x++) workerThreadStart[x].Set();
WaitHandle.WaitAll(workerThreadFinish);
}
while (true)
{
workerThreadStart[#].WaitOne();
try
{
}
catch (...)
{
}
finally
{
workerThreadFinish[#].Set();
}
}
(Note: Just typed this out in here, not in a code editor, so might have typos or syntax problems - Just trying to give a rough idea anyway)
EDIT: Oh, and when you instantiate the EWH's, bring 'em up unsignaled and AutoReset.
|
|
|
|
|
Hi,
I'm not sure why you are continually reallocating the event objects. Doing so may have created a situation where you are waiting for a signal on an event object that is no longer referenced in your code.
It is quite possible that ThreadOne could set ogThreadTwo or ogThreadThree prior to reallocation in ThreadTwo or ThreadThree. If that happens the WaitAll methods will block as they are waiting for the reallocated events to be signalled.
//Task Finished
ogEvents[0].Set();
ogThreadThree[0] = new ManualResetEvent(false);
bool blSuccess = WaitHandle.WaitAll(ogThreadThree, 4000, false);
should be reordered
ogThreadThree[0] = new ManualResetEvent(false);
ogEvents[0].Set();
bool blSuccess = WaitHandle.WaitAll(ogThreadThree, 4000, false);
so that ogThreadThree event is rellocated BEFORE you release ThreadOne.
Alan.
|
|
|
|
|
Thanks for the reply's. I have changed the code to have 4 threads, and have stopped reallocating the event and it seems to have fixed any sync issues.
Thanks
|
|
|
|
|
Hi all,
in my C#.net 3.5 windows application, i have a insert statement in my button_Click event.
but this is raising 2 times, so 2 rows with same data inserting instead of 1.
i checked in debugmode after reaching last statement it is moving to first statement again.
why this is happening?
Please give some solution
Thanks in Advance
--Naren
|
|
|
|
|
Probably you called :
button.Click += new EventHandler(button_Click);
2 times...
|
|
|
|
|
|
You might want to run a Find in your solution for "BtnOk_Click", just to be certain of that. Remember, the designer will add one event hook and hide it in the InitializeComponent() method.
This may or may not be the problem, but it's best to eliminate the easy solutions first.
|
|
|
|
|
hmmmmmmm
i did but it is showing single time only
|
|
|
|
|
Gonna have to see some code to help with this one
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
private void BtnOk_Click(object sender, EventArgs e)
{
if (TxtTotMins.Text != TxtUCmins.Text)
return;
DateTime dt = Convert.ToDateTime(System.DateTime.Now.ToString());
DateTime Wo_dt = Convert.ToDateTime(System.DateTime.Now.ToShortDateString());
DateTime mod_time=Convert.ToDateTime(System.DateTime.Now.ToLongTimeString());
string QueueId = ClientInfo.Application + "!" + Wo_dt.ToShortDateString() + "!" + TransId;
string Upload = "N";
for (int i = 1; i <= OeCnt; i++)
{
string[] Level1 = OeControl[i].Level2.Tag.ToString().Split(':');
string Level1Code = Level1[1].ToString();
string Level2Code;
string Level3Code;
if (!(string.IsNullOrEmpty(OeControl[i].Level2.Text)))
{
string[] Level2 = OeControl[i].Level3.Tag.ToString().Split(':');
Level2Code = Level2[1].ToString();
}
else
Level2Code = null;
if (!(string.IsNullOrEmpty(OeControl[i].Level3.Text)))
{
string[] Level3 = OeControl[i].Level1.Tag.ToString().Split(':');
Level3Code = Level3[1].ToString();
}
else
Level3Code=null;
string Timespent=OeControl[i].TimeText.Text;
string Query = string.Format(@"insert into SIS_OEE(T_STAMP,oper,L2_Code,L3_Code,L4_Code,time_spent,
total_time,cono,cctr,emp,job,work_date,work_shift,mod_date,mod_time,
mod_user,sfis_trans_id,queue_id,upload) values ('{0}','{1}','{2}','{3}','{4}','{5}',
'{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}',{16},'{17}','{18}')", dt, TxtOperation.Text,
Level1Code, Level2Code, Level3Code, Timespent, TxtTotMins.Text, Cono, TxtCctr.Text,
Emp, TxtJob.Text, Wo_dt, Shift, Wo_dt, mod_time, Emp, TransId, QueueId, Upload);
Utility.SFISConnection.ExecuteNonQuery(Query);
}
this.Close();
}
this is mycode inside buttonclick
|
|
|
|
|
well your query code if in a for loop so i can only assume that loop is running twice. Is this what you have indended?
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
no no
for loop running fine but
it is coming again to
{ which is the first line under btn_click event
|
|
|
|
|
and then returns after the first if statement?
if you event is being called twice then it would suggest that you hav added it to the buttons Click event more than once, are there any other events attached to the button such as MouseClick, Enter etc.
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
nowhere in my project btnOK_Click event twice, i checked in design page also.
|
|
|
|
|
Ok, well Colin's suggestion below sounds good, give that a try
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Narendra Reddy Vajrala wrote: it is coming again to
{ which is the first line under btn_click event
So what is in the call stack? It will show you what called the method. Is the call stack different from the first time the method gets called? What called the method the second time around?
|
|
|
|
|
InitializeComponent();
BtnOk.Click += new EventHandler(BtnOk_Click);
and my clickevent is
private void BtnOk_Click(object sender, EventArgs e)
{
//This Event Raising 2 times.....?
}
and design.cs
this.BtnOk.Click += new System.EventHandler(this.BtnOk_Click);
|
|
|
|
|
So like stancrm said initially, you're hooking the event twice.
You hooked it once in the designer, and another time in your design.cs. Either unhook it in the designer, or remove that line from design.cs.
|
|
|
|
|
yesssssssssssssssssssss
finally i got on deleting instance in designer.cs
so Thanks to everybody
|
|
|
|
|
You have not provided much context for the code snippets. Where are they coming from?
Are you saying that you have
BtnOk.Click += new EventHandler(BtnOk_Click); in your form's constructor, and
this.BtnOk.Click += new System.EventHandler(this.BtnOk_Click); in your form's design.cs file?
If this is the case it looks like you have added the event handler twice to the button click event. I would recommend removing the one in the constructor because the designer will take care of the one in the form's design.cs class.
Also, what is in the call stack when the BtnOk_Click method is called? (If you don't know where to get the call stack it is probably in Debug-->Windows-->Call Stack)
|
|
|
|
|
How very javascriptish--
anyway, check your Form.designer.cs file for BtnOk.Click+=new EventHandler(object sender, Eventargs e);
and then check your Form.cs file for the same. Get rid of one.
If you want to register that EventHandler always, leave it in the designer file, if you want to attach it if some condition is met - take it out and do it in the form.
var question = (_2b || !(_2b));
|
|
|
|
|
Narendra Reddy Vajrala wrote: Please give some solution
Its quite simple...add another button in a new project, put breakpoint and check is it calling twice or not. If it is then something wrong with your windows or your mouse is dying.
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN%
R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
-----------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|