Avatar billede meilby Nybegynder
21. maj 2003 - 12:33 Der er 5 kommentarer og
1 løsning

Problem med Threads

kan man ikke lave threads der har adgang til at bruge MessageBox og member variables til f.eks min listbox

min nuværende kode ser sådan her ud

UINT ClientThread(LPVOID pParam)
{
    m_log.AddString("Client Thread")
    return 0;
}

UINT ServerThread(LPVOID pParam)
{
    m_log.AddString("Serveren er Startet");   
    CSocket server,client;
    WSADATA wsaData;
    sockaddr_in local;
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret!=0){
        return 0;
    }
    local.sin_family=AF_INET; //Address family
    local.sin_addr.s_addr=INADDR_ANY; //Wild card IP address
    local.sin_port=htons((u_short)4444); //port to use
    server.Bind(4444);
    server.Listen(10);
    sockaddr_in from;
    int fromlen=sizeof(from);
    while(true){
        client.Accept(server,(struct sockaddr*)&from,&fromlen);
        AfxBeginThread(ClientThread,0);
    }
    server.Close();
    WSACleanup();
    return 0;
}

void CIBUServerDlg::OnStart()
{
    AfxBeginThread(ServerThread,0);
}

men hverken ServerThread eller ClientThread kan bruge member variablen m_log som er en member variable til en listbox.
Nogen der har en ide til hvordan jeg løser det problem ?
Avatar billede meilby Nybegynder
21. maj 2003 - 12:34 #1
Glemte at skrive at jeg koder i MS VC++ 6.0
Avatar billede jpk Nybegynder
21. maj 2003 - 12:54 #2
Du kan selvfølgelig vælge at give tråden en pointer med til variablen, men en pænere (meget) løsning er at bruge SendMessage
Avatar billede meilby Nybegynder
21. maj 2003 - 13:30 #3
Kan du give et eksemple på hvordan man bruger den, blev ikke meget klogere af at søge på msdn. Kan ikke se hvordan jeg skal kunne bruge den til at smide data i en listbox.
Avatar billede bertelbrander Novice
21. maj 2003 - 23:40 #4
Hvis man skal sende en besked fra en thread til en anden bør man bruge:
PostThreadMessage(), der er en metode i din app class, så du kan kalde den med:
AfxGetApp()->PostThreadMessage(...);
Den første parameter til PostThreadMessage() er en message id, denne bør findes ved et kald til RegisterWindowMessage() f.ex:
UINT msg_id = RegisterWindowMessage("My Private Thread ID");
I din message map for dialogen skal du tilføje en:
ON_REGISTERED_THREAD_MESSAGE(...)
for at fange din besked.
Avatar billede segmose Nybegynder
28. maj 2003 - 16:45 #5
Hjalp Bertel's forslag?
Avatar billede meilby Nybegynder
28. august 2003 - 12:19 #6
lukker spørgsmålet fandt selv en løsning.
UINT ClientThread(LPVOID pParam)
{
    CIBUServerDlg* pDlg = (CIBUServerDlg*)AfxGetApp()->m_pMainWnd;
    pDlg->m_log.AddString("Client Thread")
    return 0;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester