Hey,
Allereerst natuurlijk nog de beste wensen! Kzal eens proberen uit te leggen wat er aan de hand is, kon hier niets vinden op google..
Kheb een chat programma, waar je een main form hebt en dus chatforms. Je kunt je contacten zien in een lijst, dat werkt allemaal prima, je kunt ook op een contact dubbelklikken, en dan opent ie netjes een nieuw chatwindow dmv de volgende code:
(Sorry van de lappen code.. deze code klopt gewoon verder.. maar om het 1 en ander duidelijk te maken)
De functie newwindow is niets anders als dit:
De contstructor in de frmChatwindow zorgt ervoor dat hij ID en Nickname even snel processed:
Dit om even duidelijk te maken dat (hopelijk) hier alles klopt en er geen vragen achteraf komen van, wat is dat, en dat...
ID is inderdaad een string, maar dat is om niet constant te hoeven converten naar integers, gek genoeg hoeft dat nergens echt, alleen maar om dingen te checken in de hashlist. In deze hashlist heb ik alle IDs (account IDs eigenlijk) op een lijstje staan, met daaraan een window verbonden. Bestaat er een ID Key niet, is er dus geen window en moet er een nieuwe window komen. Komt er een bericht binnen, even de window opzoeken in de hashtable (aan de hand van een ID) en het bericht plaatsen in de window.
Berichten krijg ik binnen op een andere thread, in een while loop. Als ik een bericht binnen krijg, checkt ie eerst of er al een window bestaat, zo ja, dan stuurt ie het bericht door naar die window (uit de hashlist). Dit gedeelte werkt. Wat echter niet werkt is als er een bericht binnenkomt voor een ID wat nog niet in die hashlist staat en ik dus een nieuw window moet aanmaken.
Hier de code voor een inkomend bericht:
Data(0) is de code 11, Data(1) is het ID van degene het afkomt, en Data(2) is het bericht zelf:
Het gaat dus om die laatste else, daar moet ik sowieso een addContactWindow maken ipv direct naar de hashlist iets gooien, vanwege crossthread execution. Maar als ik nu tempWindow.Show() aanroep, komt er een nieuw window, maar blijft die window meteen hangen.
Wat ik heb geprobreerd is een nieuwe thread voor die show te maken, maar dit werkt ook niet. Ik weet echt niet wat er hier aan de hand is, ben er al een halve dag (naja.. nie constant
) mee bezig maar om 1 of andere reden blijft de form daar keihard hangen. Ik heb ook geprobeerd het in de contsructor van de form een show uit te voeren, maar hetzelfde resultaat... Mijn vermoeden is (omdat het contstante while loop is), is dat hij blijft hangen vanwege de while loop en de Read functie van de socket. Daarbij blijft de thread hangen.
Maar als ik een nieuwe thread maak, die de Show aanroept, of zelfs een aparte thread voor newWindow (met parameterizedstartThread) gebeurt er ook niet veel...
Ik denk zelf dat ik verder niet moet gaan klooien met threads, lijkt me nergens voor nodig.. maar ik zou niet weten wat ik dan wel moet doen... hij blijft gewoon hangen vanwege die socket.read() in de while loop...
Dusss.. iemand een idee hoe ik goed en veilig een nieuwe window kan maken zonder dat de window zijn thread stopt???
Dank!
(en ja.. ik weet het, zei het al.. veel code.. maar alleen om duidelijk te maken..)
Allereerst natuurlijk nog de beste wensen! Kzal eens proberen uit te leggen wat er aan de hand is, kon hier niets vinden op google..
Kheb een chat programma, waar je een main form hebt en dus chatforms. Je kunt je contacten zien in een lijst, dat werkt allemaal prima, je kunt ook op een contact dubbelklikken, en dan opent ie netjes een nieuw chatwindow dmv de volgende code:
(Sorry van de lappen code.. deze code klopt gewoon verder.. maar om het 1 en ander duidelijk te maken)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| private void contactlist_MouseDoubleClick(object sender, MouseEventArgs e)
{
frmChatwindow tempWindow;
frmChatwindow Window;
if (contactlist.ContactsWindows.ContainsKey(contactlist.SelectedItem.ToString()))
{
tempWindow = (frmChatwindow)contactlist.ContactsWindows[contactlist.SelectedItem.ToString()];
try
{
tempWindow.Show();
tempWindow.Focus();
}
//De window staat in de hashlist, maar is er blijkbaar niet
catch
{
Window = newWindow(contactlist.SelectedItem.ToString(), contactlist.ContactsNames[contactlist.SelectedItem.ToString()].ToString());
contactlist.ContactsWindows.Remove(contactlist.SelectedItem.ToString());
contactlist.ContactsWindows.Add(contactlist.SelectedItem.ToString(),Window);
}
} else {
Window = newWindow(contactlist.SelectedItem.ToString(), contactlist.ContactsNames[contactlist.SelectedItem.ToString()].ToString());
contactlist.ContactsWindows.Add(contactlist.SelectedItem.ToString(), Window);
Window.Show();
}
} |
De functie newwindow is niets anders als dit:
code:
1
2
3
4
5
6
7
8
9
10
| public frmChatwindow newWindow(string ID, string Nickname)
{
frmChatwindow Window;
Window = new frmChatwindow(ID, Nickname);
Window.SendMessage += new SendMessageEventHandler(SendMessage);
//Window.Closing += new ClosingEventHandler(WindowClosing);
return Window;
} |
De contstructor in de frmChatwindow zorgt ervoor dat hij ID en Nickname even snel processed:
code:
1
2
3
4
5
6
7
8
9
10
| public frmChatwindow(string tempID, string tempNickname)
{
InitializeComponent();
ID = Convert.ToInt32(tempID);
Nickname = tempNickname;
this.lblNickname.Text = Nickname;
this.Text = Nickname;
//this.Show();
} |
Dit om even duidelijk te maken dat (hopelijk) hier alles klopt en er geen vragen achteraf komen van, wat is dat, en dat...
ID is inderdaad een string, maar dat is om niet constant te hoeven converten naar integers, gek genoeg hoeft dat nergens echt, alleen maar om dingen te checken in de hashlist. In deze hashlist heb ik alle IDs (account IDs eigenlijk) op een lijstje staan, met daaraan een window verbonden. Bestaat er een ID Key niet, is er dus geen window en moet er een nieuwe window komen. Komt er een bericht binnen, even de window opzoeken in de hashtable (aan de hand van een ID) en het bericht plaatsen in de window.
Berichten krijg ik binnen op een andere thread, in een while loop. Als ik een bericht binnen krijg, checkt ie eerst of er al een window bestaat, zo ja, dan stuurt ie het bericht door naar die window (uit de hashlist). Dit gedeelte werkt. Wat echter niet werkt is als er een bericht binnenkomt voor een ID wat nog niet in die hashlist staat en ik dus een nieuw window moet aanmaken.
Hier de code voor een inkomend bericht:
Data(0) is de code 11, Data(1) is het ID van degene het afkomt, en Data(2) is het bericht zelf:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| case 11:
frmChatwindow tempWindow;
if (contactlist.ContactsWindows.ContainsKey(data.GetValue(1).ToString()))
{
tempWindow = (frmChatwindow)contactlist.ContactsWindows[data.GetValue(1).ToString()];
tempWindow.chatMessage(data.GetValue(2).ToString());
}
else
{
tempWindow = newWindow(data.GetValue(1).ToString(), contactlist.ContactsNames[data.GetValue(1).ToString()].ToString());
addContactWindow(data.GetValue(1).ToString(), tempWindow);
tempWindow.Show();
}
break; |
Het gaat dus om die laatste else, daar moet ik sowieso een addContactWindow maken ipv direct naar de hashlist iets gooien, vanwege crossthread execution. Maar als ik nu tempWindow.Show() aanroep, komt er een nieuw window, maar blijft die window meteen hangen.
Wat ik heb geprobreerd is een nieuwe thread voor die show te maken, maar dit werkt ook niet. Ik weet echt niet wat er hier aan de hand is, ben er al een halve dag (naja.. nie constant
Maar als ik een nieuwe thread maak, die de Show aanroept, of zelfs een aparte thread voor newWindow (met parameterizedstartThread) gebeurt er ook niet veel...
Ik denk zelf dat ik verder niet moet gaan klooien met threads, lijkt me nergens voor nodig.. maar ik zou niet weten wat ik dan wel moet doen... hij blijft gewoon hangen vanwege die socket.read() in de while loop...
Dusss.. iemand een idee hoe ik goed en veilig een nieuwe window kan maken zonder dat de window zijn thread stopt???
Dank!
(en ja.. ik weet het, zei het al.. veel code.. maar alleen om duidelijk te maken..)