Startar en ny thread från en form. Funktionen är att den ska ligga och lyssna på en specifik port. Fungerar bra. När den sedan får se någon typ av information ska åtgärder göras. Har då funktioner för detta i en specifk klass som ärver från basklassen( om det nu spelar någon roll, vilket jag inte tror). Problemet är att när funktionera körs så får jag "The thread '<No Name>' (0xc34) has exited with code 0 (0x0)." Är det något jag har glömt eller tänker jag fel? Du får nog visa lite kod, Kommer lite kod Svarar mig själv med lite mera strul. Ussh! Viktig info: Hmm tack för svaret, har testat runt lite men får det inte att fungera som jag vill, är absolut ingen expert så jag gör säkert en massa fel. Så här ligger det till, skapar en thread som lyssnar mot en server, denna får ett meddelande som körs mot en select case sats för att se vad som ska göras alltså i stil med: Din worker-thread (den som ligger och lyssnar) bör signalera huvudtråden när något har hänt, varpå huvudtråden anvsvarar för att skapa nya fönster etc. Ta dig en titt på denna tåden [Flytta över exekvering till annan tråd.] (som vi snackade om på chatten igår) om vad du måste tänka på när du delegerar events mellan trådar (Patrik slängde upp ett fungerade exempel). Ushh svårt detta, kollat lite på hans kod, förstår inte mycket. Jobbigt att det ska vara så svårt att hålla flera trådar igång...Thread och ärvda klasser / stream
Sv: Thread och ärvda klasser / stream
det känns direkt som att din tråd ramlar ur scope direkt.Sv: Thread och ärvda klasser / stream
<code>
Dim ircClient As New Irc.IrcAccess()
Dim t As New Thread(New ThreadStart(AddressOf ircClient.ConnectToIrc))
t.Start()
</code>
<code>
...
...
..
Case "001"
'Functions.Code001()
CType(ActiveForm, frmMain).sb1.Text = "Ansluting upprättad"
</code>
Detta fungerar men jag vill använda mig av: // Edit, efter lite närmare testing så fungerade det visst inte
<code>
ublic Class Functions
Inherits IrcAccess
Function Code001()
CType(ActiveForm, frmMain).sb1.Text = "Ansluting upprättad"
End Function
</code>
När detta körs så får jag thread-> exitSv: Thread och ärvda klasser / stream
Har en thread som ligger och kör. När den stöter på ett meddelande från servern som den lyssnar mot vill jag att den ska köra en ny thread, om detta nu är möjligt, i alla fall öppna en ny form, om detta nu är möjligt.
Alltså i den tråd som körs:
<code>
dim alla as new frm
frm.show()
</code>
Formen öppnas också mycket rikigt med den "fryser".
Blev väldigt rörigt det här, men menSv: Thread och ärvda klasser / stream
Du behöver en ny messagethread för varje tråd. Det finns några roliga sätt att starta en sådan på. De fyre jag känner till varierar lite. Det viktiga att veta är att 3 utav dem inte fortsätter koden förens de är avslutade. En utav dem kan man starta när man vill och avsluta när man vill; och koden fortsätter direkt efter att loopen är startad (messagethread-saken är egentligen en evighetsloop.) Det är omöjligt att start en messageloop i en annan tråd än sin egna.
Vad den här loopen gör är att leta efter window messages, alltså meddelanden från t.ex. olika fönster, windows etc. De här meddelandena är t.ex. att man flyttar på musen, att fönstret försöker stängas eller liknande.
De här varianterna känner jag till:
1) System.Windows.Forms.Application.Run()
Den startar den vanligaste loopen. För att avsluta den anropar man .Exit() istället. Den stora nackdelen är att alla fönster i den tråden stängs när man anropar .Exit
2) EttFönster.ShowDialog()
EttFönster är alltså ett helt vanligt formulär. Det gör så att fönstret blir modalt i den tråden. Den startar en messageloop. När fönstret stängs stannas den loopen
3) Deklarera api:t WaitMessage. Kör en oändlig loop med följande:
<code>
do while ditt_villkor
WaitMessage
System.Windows.Forms.DoEvents()
loop
</code>
4) Använd lite Reflection och kör:
<code>
Dim m As System.Reflection.MethodInfo
m = GetType(System.Windows.Forms.Application).GetMethod("BeginModalMessageLoop", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
m.Invoke(Nothing, Nothing)
</code>
Det startar en modalmessageloop. För att stoppa den, anropa samma kod fast med EndModal... etc.
Sedan finns det mer kul i System.Windows.Forms.Application*-klasserna som kan vara intressant att köra med reflection.Sv: Thread och ärvda klasser / stream
<code>
while true
Select case message
case "blalal"
' Här vill jag öppna en ny form
' Testar med
Application.Run(new myform)
end while
</code>
Kod i myform:
<code>
' Startar en ny thread som ligger och lyssnar mot en variabel i tidigare kod,var 3:e sekund, om den innehåller något körs kod. Säkert väldigt dålig lösning, men men
</code>
Problemet är att den tråden som från början ska gå runt runt stannar när Application.Run(new myform) körs. Första gången jag håller på med detta så har inte en aning om vad som kan göras...Sv: Thread och ärvda klasser / stream
//AndreasSv: Thread och ärvda klasser / stream