CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Tworzenie nowych okien - formularzy + Wątek CreateThread

Tworzenie nowych okien - formularzy + Wątek CreateThread

dział ogólny

Tworzenie nowych okien - formularzy + Wątek CreateThread

Nowy postprzez Darek_C++ » niedziela, 21 listopada 2010, 12:38

Kontynuując temat rozpoczęty w viewtopic.php?f=2&t=1144 w tak tworzonych oknach chciałem wykorzystać wątki tworzone funkcja WINAPI CreateThread w tym celu zamieściiłem następujący kod:

KOD cpp:     UKRYJ  
DWORD ThreadProc (LPVOID lpdwThreadParam )
{
        Form4->StatusBar1->Panels->Items[1]->Text="Start pobierania danych dane..."; // TUTAJ DEBUGER Zgłasza wyjątek
        // Jakieś czasochłonne operacje
}

//---------------------------------------------------------------------------
void __fastcall TForm4::Button3Click(TObject *Sender)
{
        int i;
        DWORD dwThreadId;
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,(LPVOID) &i,0, &dwThreadId) ;
}

Jadnak z chwilą uruchomienia wątku program się "wysypuje" z komunikatem, że nastąpi jego zamknięcie.
W czym tkwi problem ?
Poproszę o kolejną pomoc.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Tworzenie nowych okien - formularzy + Wątek CreateThread

Nowy postprzez Cyfrowy Baron » niedziela, 21 listopada 2010, 13:18

Sprawdziłeś, czy jeżeli stworzysz taki watek dla okna nie tworzonego dynamicznie, to problem również występuje. Trzeba najpierw ustalić, czy problem związany jest z tym, że wątek jest tworzony w oknie tworzonym dynamicznie, czy też sam wątek jest źle tworzony!
W pliku pomocy do C++Builder 2010 jest taki przykład użycia funkcji CreateThread:


KOD cpp:     UKRYJ  
#include <windows.h>
#include <strsafe.h>

#define MAX_THREADS 3
#define BUF_SIZE 255

typedef struct _MyData {
    int val1;
    int val2;
} MYDATA, *PMYDATA;

DWORD WINAPI ThreadProc( LPVOID lpParam )
{
    HANDLE hStdout;
    PMYDATA pData;

    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;

    // Cast the parameter to the correct data type.

    pData = (PMYDATA)lpParam;

    // Print the parameter values using thread-safe functions.

    StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
        pData->val1, pData->val2);
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
    WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);

    // Free the memory allocated by the caller for the thread
    // data structure.

    HeapFree(GetProcessHeap(), 0, pData);

    return 0;
}
 
void main()
{
    PMYDATA pData;
    DWORD dwThreadId[MAX_THREADS];
    HANDLE hThread[MAX_THREADS];
    int i;

    // Create MAX_THREADS worker threads.

    for( i=0; i<MAX_THREADS; i++ )
    {
        // Allocate memory for thread data.

        pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                sizeof(MYDATA));

        if( pData == NULL )
            ExitProcess(2);

        // Generate unique data for each thread.

        pData->val1 = i;
        pData->val2 = i+100;

        hThread[i] = CreateThread(
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadProc,        // thread function
            pData,             // argument to thread function
            0,                 // use default creation flags
            &dwThreadId[i]);   // returns the thread identifier
 
        // Check the return value for success.
 
        if (hThread[i] == NULL)
        {
            ExitProcess(i);
        }
    }

    // Wait until all threads have terminated.

    WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);

    // Close all thread handles upon completion.

    for(i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThread[i]);
    }
}
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tworzenie nowych okien - formularzy + Wątek CreateThread

Nowy postprzez Darek_C++ » niedziela, 21 listopada 2010, 15:31

Teraz nie sprawdzałem, ale pamiętam, że kiedyś też miałem ten sam problem w formularzach tworzonych dynamicznie....
Zamiast tego skorzystałem z wątków obsługiwanych przez klasę TThread BCB z którymi w tym wypadku nie ma takich problemów :)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 13 gości

cron