Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C# und .NET ::  Thread beenden     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Opal19
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.02.2011
Beiträge: 26
Beitrag Opal19 Mitglied 20:54:57 31.01.2012   Titel:   Thread beenden            Zitieren

Hallo zusammen,

wie kann ich einen Thread beenden, welche gerade die Tastatur abfraget mit z.B. "reader.ReadString()"

thread.abort() funktioniert da nicht...

Grüße Opal
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 21:14:05 31.01.2012   Titel:              Zitieren

Es gibt genau einen korrekten Weg um einen Thread zu beenden. Und das ist, die Threadfunktion returnen zu lassen.

_________________
one point of view will never reveal the entire scene.
Opal19
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.02.2011
Beiträge: 26
Beitrag Opal19 Mitglied 21:19:26 31.01.2012   Titel:              Zitieren

ok, danke schon mal, die Frage die bleibt ist, wie ich den Thread dazu bewegen kann von der Tastatur abzulassen.

Ich suche eine Methode wie Thread.Return(); ;-))

Grüße Opal
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 21:36:35 31.01.2012   Titel:              Zitieren

Opal19 schrieb:
ok, danke schon mal, die Frage die bleibt ist, wie ich den Thread dazu bewegen kann von der Tastatur abzulassen.

Ja da musst du dir was überlegen. Wenn der Thread in einer Methode festhängt, dann wirst du einen Weg finden müssen um diese Methode zurückkehren zu lassen. Da ich nicht weiß um was es sich da genau handelt, kann ich leider nicht mehr dazu sagen.

Opal19 schrieb:
Ich suche eine Methode wie Thread.Return(); ;-))

Sowas wirst du nicht finden, das macht keinen Sinn. Der Thread muss returnen. Und dafür gibt's das return; Statement.

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 21:42:10 31.01.2012, insgesamt 2-mal bearbeitet
Opal19
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.02.2011
Beiträge: 26
Beitrag Opal19 Mitglied 21:45:14 31.01.2012   Titel:              Zitieren

Hi Dot,

ich hoffte Du hättest den ;-)) Smilie gesehen...

ist mir schon klar, dass es meine "Wunschmethode" nicht gibt.

Meine Konsolenanwendung fragt in einem Thread die Tastatur ab .ReadLine()...

Dieses tut der Thread offensichtlich so lange bis ENTER eingegeben wird. Danach wirkt thread.abort() und der Thread wird beendet.

Alles was mir einfällt wäre dei ENTER Eingabe zu simulieren, aber wirklich chick finde ich dieses nicht. Hat .NET nix dafür in Petto?

Grüße Opal
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
Beitrag hustbaer Mitglied 22:22:15 31.01.2012   Titel:              Zitieren

Wenn der Thread in einem Alertable Wait State ist, kann man ihm nen APC unterschieben.
Wobei aber fraglich ist, wie der Framework-Code dann darauf reagiert.
Also mit Vorsicht zu geniessen.

Ansonsten "einfach" asynchrone IO-Funktionen verwenden.
Oder so.
Nen? :)

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 22:26:07 31.01.2012   Titel:              Zitieren

Ich hätte jetzt einfach mal versucht Console.In zu closen, evtl. returned Read() dann oder wirft eine Exception. Ansonsten musst du dich wohl mit Async IO befassen, wie hustbaer schon angedeutet hat...

_________________
one point of view will never reveal the entire scene.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
Beitrag hustbaer Mitglied 22:32:41 31.01.2012   Titel:              Zitieren

BTW: versuch mal in den Framework-Code reinzusteppen, bzw. guck dir den (native) Callstack von dem Thread an, in welcher Funktion der genau hängt.

Möglicherweise reicht es wirklich einen APC an den Thread zu schicken, der genau nix tut. Dadurch kommen die diversen "alertable" Wartefunktionen nämlich zurück, und wenn du Glück hast wird das "Abort Flag" nochmal geprüft, bevor der Thread wieder heia geschickt wird.

Wobei ich jetzt nicht weiss wie man in .NET nen APC absetzt.
Von "native" Code aus würde man QueueUserAPC verwenden, falls dir die Info hilft.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
loks
Unregistrierter




Beitrag loks Unregistrierter 22:39:16 31.01.2012   Titel:              Zitieren

Credits to Google.
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 string ReadLine(int timeoutms)
        {
            ReadLineDelegate d = Console.ReadLine;
            IAsyncResult result = d.BeginInvoke(null, null);
            result.AsyncWaitHandle.WaitOne(timeoutms);//timeout e.g. 15000 for 15 secs
            if (result.IsCompleted)
            {
                string resultstr = d.EndInvoke(result);
                Console.WriteLine("Read: " + resultstr);
                return resultstr;
            }
            else
            {
                Console.WriteLine("Timed out!");
                throw new TimedoutException("Timed Out!");
            }
        }
 
        delegate string ReadLineDelegate();
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string ReadLine(int timeoutms)
{
ReadLineDelegate d = Console.ReadLine;
IAsyncResult result = d.BeginInvoke(null, null);
result.AsyncWaitHandle.WaitOne(timeoutms);//timeout e.g. 15000 for 15 secs
if (result.IsCompleted)
{
string resultstr = d.EndInvoke(result);
Console.WriteLine("Read: " + resultstr);
return resultstr;
}
else
{
Console.WriteLine("Timed out!");
throw new TimedoutException("Timed Out!");
}
}

delegate string ReadLineDelegate();
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 string ReadLine(int timeoutms)
        {
            ReadLineDelegate d = Console.ReadLine;
            IAsyncResult result = d.BeginInvoke(null, null);
            result.AsyncWaitHandle.WaitOne(timeoutms);//timeout e.g. 15000 for 15 secs
            if (result.IsCompleted)
            {
                string resultstr = d.EndInvoke(result);
                Console.WriteLine("Read: " + resultstr);
                return resultstr;
            }
            else
            {
                Console.WriteLine("Timed out!");
                throw new TimedoutException("Timed Out!");
            }
        }
 
        delegate string ReadLineDelegate();
Opal19
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.02.2011
Beiträge: 26
Beitrag Opal19 Mitglied 22:39:56 31.01.2012   Titel:              Zitieren

Dot, genial, es tuuuut!

Danke Dir, opal (allen anderen nat. auch)


Zuletzt bearbeitet von Opal19 am 22:45:19 31.01.2012, insgesamt 1-mal bearbeitet
µ
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.06.2001
Beiträge: 1551
Beitrag µ Mitglied 10:34:09 01.02.2012   Titel:              Zitieren

loks schrieb:
Credits to Google.
C# Code:
...
C# Code:
...
C# Code:
...


Leider keine Lösung. Nach einem Timeout läuft das Delegat asynchron weiter und wartet in dem Fall also auf die nächste Benutzereingabe. Die ist damit verloren.
C/C++ Forum :: C# und .NET ::  Thread beenden   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.