|
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
|
|
|
|
|
yes,
from some other form am comming to this form and no where in my project it doesnt happend but y here only....!?
|
|
|
|
|
what are you doing to know that its calling twice ?
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
|
|
|
|
|