WaitForSingleObject verhindert Thread.Abort



  • Hi,

    folgendes Problem:

    Ich hab 'nen WaitableTimer laufen und warte in einem separaten Thread mit WaitForSingleObject() auf den.
    Wenn ich jetzt versuche den Thread mit Thread.Abort abzubrechen, dann tut sich nichts. Auch Thread.Interrupt funktioniert nicht.

    Bye

    Aydan



  • H, erstelle ein Delegate im Thread und rufe das event nach Threadende auf. SO kannst du sehr gut den Timer ersetzen und veruracht auch weniger Traffic auf den PC.



  • Das Problem ist nicht der Timer, den kann ich nämlich nicht ersetzen, sondern dass der Thread sich nicht beenden lässt.

    Bye
    Aydan



  • Hi,

    Einerseits erstllst du ein Thread um irgendwas zu mahcen. ANdereerseits wartest du mit "WaitForSingleObject" auf den Thread.
    Dann kannste den Thread auch gleich weglassen.

    Vielleicht hilft dir BeginInvoke und EndInvoke Weiter. Ich weiss nciht, da du dein Problem nur schilderst, und ich daraus nicht den Sinn/die Aufgabe ableiten kann.



  • OK, ich werd' nochmal erklären was ich meine.

    Ich erstelle einen timer um den rechner aus dem suspend aufzuwecken. dann erstell ich einen thread um auf den timer zu warten, sodass ich meinem programm mit einem event sagen kann wann der timer abgelaufen ist. warten tu ich auf den timer mit waitforsingleobject, weil's nicht anders geht. wennd er timer abgelaufen ist, läuft der wartende thread weiter und löst ein ereignis aus. meine frage ist: wie kann ich den thread, der waitforsingleobject ausführt beenden, wenn ich den timer loswerden will bevor er abgelaufen ist.

    bye
    Aydan



  • nicht auf den Thread warten. VOm THread benachrichtigen lassen!
    Siehe Delegates
    Beispiel:

    Schreib ne Klasse, die den Background kapselt:

    public delegate void ThreadEndDelegate();
    	public class ThreadClass
    	{
    		private Thread _Thread;
    		public event ThreadEndDelegate ThreadEndEvent;
    
    		public ThreadClass(ThreadEndDelegate AEndHandler)
    		{
    			ThreadEndEvent+=AEndHandler;
    			Start();
    		}
    
    		private void Start()
    		{
    		_Thread=new Thread(new ThreadStart(ThreadProc));
    		_Thread.Start();
    		}
    		private void ThreadProc()
    		{
    			for(int i=0;i<1000;i++)
    			{
    				Console.WriteLine("Counter : "+ i.ToString());
    			}
    			lock(this)
    			{
    				if(ThreadEndEvent!=null)
    					ThreadEndEvent();
    			}
    		}
    	}
    

    ruf dass dann einfach im Timer auf. Ich mal mit nem ButtonClick simuliert:

    private void button1_Click(object sender, System.EventArgs e)
    		{
    			 new ThreadClass(new ThreadEndDelegate(ThreadEnd));
    		}
    		private void ThreadEnd()
    		{
    			MessageBox.Show("End");
    		}
    

    so brauchst du nicht auf den Thread zu warten.

    Kann auch sein, dass ich dich falsch verstanden hab. Aber es macht ja kein Sinn in einem Thread auf ein Timer zu warten um darauf zu reagieren. Man kann ja direkt auf ihn reagieren.



  • OK, das ist nicht was ich meine.

    Ich warte ja nicht auf den thread, sondern mit dem thraad auf den timer.

    ungefähr so:

    objekt erstellt timer und schiebt ihn an
    objekt erstellt thread
    thread wartet auf timer
    wenn timer abgelaufen -> ereignis auslösen
    thrad beendet

    Das funktioniert auch problemlos.

    aber:

    während der thread auf den timer wartet kann ich ihn nicht vom hauptthread aus beenden, wenn ich den timer nicht mehr brauchen sollte.



  • Ein Timer ist doch asyncron und hat auch ein ereignis. Wofür soll der Thread gut sein.



  • Nun ja, ich schreib das programm in VB und da wollte ich mich nicht auch noch mit irgendwelchen callbacks rumärgern.
    Deshalb der thread mit WaitForSingleObject. Das schien mir die einfachere Variante.

    Tschö
    Aydan


Anmelden zum Antworten