| Autor |
Nachricht |
Opal19
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.02.2011
Beiträge: 26
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
µ Mitglied
10:34:09 01.02.2012 Titel: |
|
Zitieren |
| loks schrieb: | Credits to Google.
|
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. |
|
|
|
 |