Гуру! Не открывается бд в потоке (не в потоке открывается)
Код:
Unhandled exception at 0x1b760401 in Bellvisual.exe: 0xC0000005: Access violation reading location 0x0000000c.
Не в потоке, а в обычном методе класса все работает нормально.
Вот код:
Обьявление "потоковой функции"
Код:
...
public:
friend UINT OurThread(LPVOID pParam);
...
public:
friend UINT OurThread(LPVOID pParam);
...
Запуск потока
Код:
...
HWND hWnd = GetSafeHwnd();
AfxBeginThread(OurThread, hWnd, THREAD_PRIORITY_NORMAL);
...
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");//вот здесь и выскакивает
...
}
...
}
{
CDaoWorkspace *ws = new CDaoWorkspace;
CDaoDatabase db(ws);
try
{
db.Open("dbase_bell.mdb");//вот здесь и выскакивает
...
}
...
}
В чем дело?
А AfxDaoInit кто будет вызывать?
Как можно узнать об окончании потока.
Можно ли убить поток в функции
UINT OurThread(LPVOID pParam)
{ ...
AfxEndThread(0);
}
Цитата: EuGenius
Спасибо. Всё нормально.
Как можно узнать об окончании потока.
Можно ли убить поток в функции
UINT OurThread(LPVOID pParam)
{ ...
AfxEndThread(0);
}
Как можно узнать об окончании потока.
Можно ли убить поток в функции
UINT OurThread(LPVOID pParam)
{ ...
AfxEndThread(0);
}
Узнать можно по разному... Начинае от простого SendMessage до WaitForSingleObject.
По идее поток умирает как только происходит выход из функции OurThread. Если же тебе нужно убивать поток из другого потока, то тут TerminateThread скорее всего подойдет.
сам поток не убивается наверное
я смотрел в диспетчере задач - постепенно выделенная память увеличивается.
смотрел то же самое без потока - стабильно
Цитата: 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);
}
}
#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);
}
}