Jag har inte jobbat alls lång tid med MFC (ungefär 1-2 veckar bara) och har gjort ett program som skickar lite data övernätverket och skriver ut händelser i ett "loggfönster" Du har gjort så att man inte behöver skicka med ett heltal till funktionen CDlg::AddEvent, vilket du i exemplet inte heller gör. Hmm, jag missa bara att skriva med den parametern nu. (jag skrev av, inte kopierade) Vet inte om jag förstog dig riktigt, men om det är i send(...) det hänger sig beror det kanske på att du skickar data över nätverket synkront. Alltså stoppas allt i din process upp tills allt data är skickat och din socketfunktion (eller vad det nu är) har returnerat. Om samma komm. klass fungerar i consolemiljö verkar det dock som om min förklaring inte håller. :) Här är alla send funktioner: Antagligen gör du anropen till servern i samma tråd som användargränssnittet. Då kan det inte uppdateras samtidigt. Du måste starta en ny tråd som gör serveranropen. Se AfxBeginThread i hjälpen. Tänk på att du kan behöva använda synkroniseringsobjekt, t.ex. CMutex i vissa lägen när du kör flera trådar. I MFC måste man också tänka på att den tråd som skapar ett MFC-objekt även måste ta bort det! När du skickar meddelanden mellan trådar, använd PostMessage. hm... det där lät komplicerat ... ;)Uppdatering av MFC fönster (Nätverk mm)
loggfönstret är en vanlig EDIT-box med readonly och med värde variabel i format CString.
vid varje händelse som skall läggas till i loggen kallar jag på funktionen <code>CDlg::AddEvent(const char* s, int i = 0)</code>
som ser ut så här:
<code>
CDlg::AddEvent(const char* s, int i)
{
UpdateData(true);
char tmp[255];
if (i)
sprintf(tmp,"Event %i: %s\r\n");
else
sprintf(tmp,"%s\r\n");
m_EVENT_LOGG += tmp;
UpdateData(false);
}
</code>
tex:
<code>
send(...); // sending packages
AddEvent("Packages Sent..."); // add to logg
</code>
när jag skickar packeten så "hänger" sig programmet tills den har fått respons från mottagardatorn, vilket är lite konstigt eftersom samma källkod till själva nätverkskoden fungerar utan att göra det i console miljö, och händelserna (loggen) uppdateras inte och du kan inte göra någonting annat i programmet undertiden. (tex. trycka på "cancel")
Däremot uppdateras fönster iaf verkar det som, för Editboxens rulllista "expanderar" eftersom det blir fler rader, men ingen text i den syns. Lite störande faktiskt.
Jag provade med att lägga till Sleep() i slutet på CDlg::AddEvent() för jag tänkte att CPUn kanske inte hänger med att uppdatera texten. (CPU belastningen ligger nämligen på 100% när den hänger sig)
men det funkade inte häller.
(när programmet fått respons kommer texten fram, så texten läggs till korrekt i CString variabeln m_EVENT_LOGG)
Nån som har nån idé om vad det kan vara?Sv: Uppdatering av MFC fönster
I IF satsen använder du däremot variabeln "i" för att se om "i" är "sann", d.v.s. om IF satsen skall köras.
I ditt fall blir aldrig "i" "sann" m.a.o. den körs aldrig. I din funktion körs bara ELSE satsen.
Om jag inte missat att du skickar med ett tal förstås.
Vet inte om detta spelar roll för uppdateringen av ditt loggfönster, men ändå.
/HåkanSv: Uppdatering av MFC fönster
Sv: Uppdatering av MFC fönster
Kan du ge lite mer info om hur din send() funktion ser ut?
// JarleSv: Uppdatering av MFC fönster
<code>
if (send(s, sendcode1, sizeof(sendcode1)-1, 0) == -1)
{
sprintf(tmp,"Error sending Packets"); AddEvent(tmp);
UpdateData(false);
closesocket(s);
return 1;
}
memset(&buffer, '\x41', 240);
send(s, buffer, 240, 0);
send(s, sendcode2, sizeof(sendcode2)-1, 0);
memset(&buffer, '\x42', 5000);
send(s, buffer, 5000, 0);
send(s, sendcode3, sizeof(sendcode3)-1, 0);
memset(&buffer, '\x43', 512);
send(s, buffer, 512, 0);
send(s, sendcode4, sizeof(sendcode4)-1, 0);
memset(&buffer, '\x44', 20480);
send(s, buffer, 20480, 0);
memset(&buffer, '\x44', 5000);
send(s, buffer, 5000, 0);
send(s, sendcode5, sizeof(sendcode5)-1, 0);
memset(&buffer, '\x45', 5000);
send(s, buffer, 5000, 0);
send(s, sendcode6, sizeof(sendcode6)-1, 0);
memset(&buffer, '\x46', 5000);
send(s, buffer, 5000, 0);
send(s, sendcode7, sizeof(sendcode7)-1, 0);
memset(&buffer, '\x47', 5000);
send(s, buffer, 5000, 0);
send(s, sendcode8, sizeof(sendcode8)-1, 0);
memset(&buffer, '\x48', 5000);
send(s, buffer, 5000, 0);
</code>
sendcodeX är definierade som (tex.)
<code>
char sendcode8[] =
"\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00";
</code>
Men grejjen är att fönstret uppdateras i rulllisten, men jag ser inte texten...
programmet skall ju visa så här:
med en förstålig delay mellan varje delmoment. Det som du nämnde.
Grejen är ju att jag ser ju att fönstret uppdateras eftersom rulllisten expanderar,
men jag ser ju ingen text! Så man kan tro att programmet hängde sig, och avslutar det inkorrekt.
Så en delay när han skickar det är inget konstigt... grejjen är ju att jag vill se händelseförloppet!
<code>
Resolving Hostname...
(fail)? Resolve of %s failed, please try again
Connecting...
(fail)? Couldn't connect to host
Conntected!
Sending packages...
(fail)? Error sending packages
</code>
*notera att efter varje fail så avslutas ju funktionenSv: Uppdatering av MFC fönster (Nätverk mm)
Sv: Uppdatering av MFC fönster (Nätverk mm)
men jag skall kolla upp det
förresten - fönstret hänger sig bara när man skickar till en dator med Microsoft Visual Studio inlaggt... :?