i want modify interval value of timer instance of system.microsoft.timer worker thread when change value in thread running worker thread, timer stopped.
let see source code
private void scan_screen(object sender, eventargs e) { textbox1.text += "a"; } private void button1_click(object sender, eventargs e) { g_receiver_timer = new system.windows.forms.timer(); g_receiver_timer.enabled = true; g_receiver_timer.interval = timer_interval; g_receiver_timer.tick += new eventhandler(scan_screen); } private void button2_click(object sender, eventargs e) { g_control_thread = new thread(new parameterizedthreadstart(control_message_receiver)); g_control_thread.start(200); } //thread function public void control_message_receiver(object v) { g_receiver_timer.stop(); g_receiver_timer.interval = 200; g_receiver_timer.enabled = true; g_receiver_timer.tick += new eventhandler(scan_screen); }
why happening occurred? how can make run? (i want adjust interval value of timer in worker thread)
you need invoke control_message_receiver
on ui thread since have spawned worker thread , accessing objects on ui thread context.
and don't need re-declare tick event on worker thread method.
look @ snippet below:
private void scan_screen(object sender, eventargs e) { textbox1.text += "a"; } private void button1_click(object sender, eventargs e) { g_receiver_timer = new system.windows.forms.timer(); g_receiver_timer.enabled = true; g_receiver_timer.interval = 1000; g_receiver_timer.tick += new eventhandler(scan_screen); } private void button2_click(object sender, eventargs e) { thread g_control_thread = new thread(new parameterizedthreadstart(control_message_receiver)); g_control_thread.start(1); } //thread function public void control_message_receiver(object v) { //timer1.stop(); //why stop? -- remove instead intervalchange((int)v); //call method , invoke on ui thread g_receiver_timer.enabled = true; //timer1.tick += new eventhandler(scan_screen); // -- remove } delegate void intervalchanger(int time); void changeinterval(int time) { g_receiver_timer.interval = time; } void intervalchange(int time) { this.invoke(new intervalchanger(changeinterval), new object[] {time}); //invoke on ui thread }
Comments
Post a Comment