Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Гуру! Не открывается бд в потоке (не в потоке открывается)

9.0K
29 января 2007 года
EuGenius
48 / / 12.01.2007
Создаю программно поток. Открываю в нем базу данных(DAO, MS Access) и в дебаге сообщение:
 
Код:
Unhandled exception at 0x1b760401 in Bellvisual.exe: 0xC0000005: Access violation reading location 0x0000000c.


Не в потоке, а в обычном методе класса все работает нормально.
Вот код:
Обьявление "потоковой функции"
 
Код:
...
public:    
    friend UINT OurThread(LPVOID pParam);
...


Запуск потока
 
Код:
...
            HWND hWnd = GetSafeHwnd();
    AfxBeginThread(OurThread, hWnd, THREAD_PRIORITY_NORMAL);
...


Сама функция потока
Код:
UINT OurThread(LPVOID pParam)
{
    CDaoWorkspace *ws = new CDaoWorkspace;
    CDaoDatabase db(ws);
    try
    {
        db.Open("dbase_bell.mdb");//вот здесь и выскакивает
        ...
    }
...
}


В чем дело?
395
30 января 2007 года
RelB
367 / / 09.11.2002
А AfxDaoInit кто будет вызывать?
9.0K
30 января 2007 года
EuGenius
48 / / 12.01.2007
Спасибо. Всё нормально.
Как можно узнать об окончании потока.
Можно ли убить поток в функции
UINT OurThread(LPVOID pParam)
{ ...
AfxEndThread(0);
}
395
30 января 2007 года
RelB
367 / / 09.11.2002
Цитата: EuGenius
Спасибо. Всё нормально.
Как можно узнать об окончании потока.
Можно ли убить поток в функции
UINT OurThread(LPVOID pParam)
{ ...
AfxEndThread(0);
}


Узнать можно по разному... Начинае от простого SendMessage до WaitForSingleObject.
По идее поток умирает как только происходит выход из функции OurThread. Если же тебе нужно убивать поток из другого потока, то тут TerminateThread скорее всего подойдет.

9.0K
30 января 2007 года
EuGenius
48 / / 12.01.2007
дай пример, как узнать об окончании потока и убить его.
сам поток не убивается наверное
я смотрел в диспетчере задач - постепенно выделенная память увеличивается.
смотрел то же самое без потока - стабильно
395
31 января 2007 года
RelB
367 / / 09.11.2002
Цитата: EuGenius
дай пример, как узнать об окончании потока и убить его.
сам поток не убивается наверное
я смотрел в диспетчере задач - постепенно выделенная память увеличивается.
смотрел то же самое без потока - стабильно


Вот, пример из MSDN, разбирайся

Код:
#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 = 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 = CreateThread(
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadProc,        // thread function
            pData,             // argument to thread function
            0,                 // use default creation flags
            &dwThreadId);   // returns the thread identifier
 
        // Check the return value for success.
 
        if (hThread == 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);
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог