2012-05-25 2 views
0

Я пытаюсь написать программу Teamcenter ITK (c based), которая будет работать как другой поток, вызванный из основного потока. Основной поток вызывается из действия в пользовательском интерфейсе. Поскольку дочерний поток занимает много времени, чтобы завершить, если я не создаю дочерний поток и помещаю код в основной поток, пользовательский интерфейс замерзает в течение 10 минут, что неприемлемо. Теперь как основной, так и дочерний потоки необходимо обмениваться аутентификацией, которая была выполнена основным потоком, поскольку я использую SSO. Им также необходимо подключиться к базе данных. Наконец, основной поток не должен ждать завершения дочернего потока, так как иначе вся цель иметь дочерний поток будет побеждена. Код для вызова дочернего потока являетсяМногопоточность в Teamcenter ITK

handle = (HANDLE) _beginthread (submitToPublishTibcoWf, 0, &input); // create thread 
do 
{ 
    sprintf (message, "Waiting %d time for 1000 milliseconds since threadReady is %d\n", i++, threadReady); 
    log_msg (message); 
    WaitForSingleObject(handle, 1000); 
} 
while (!threadReady); 

sprintf (message, "Wait for thread to be ready over after %d tries since threadReady is %d\n", i, threadReady); 
log_msg (message); 
log_msg ("Main thread about to exit now"); 

Я установил = 1 (глобальная переменная) threadReady всякий раз, когда я собираюсь выполнить фрагмент кода, в детской теме, которая занимает 8 минут, чтобы бежать.

Теперь проблема заключается в том, что дочерний поток ведет себя wierd после выхода основного потока. И я получаю эту ошибку:

Пт май 25 11:34:46 2012: Основная тема о выходе Это приложение попросило Runtime прекратить его необычным способом. Для получения дополнительной информации обратитесь в службу поддержки приложения.

Большая часть дочерней нити выполняется, но иногда она просто падает до самого конца.

Любая помощь очень ценится.

+0

Также иногда я получаю эту ошибку во время отладки: Необработанное исключение в 0x580d8390 в tcserver.exe: 0xC0000005: Доступ к определению места нарушения доступа 0xffffffec. – Yogesh

ответ

1

Чтобы предотвратить выход дочернего потока, мы можем использовать отсоединение, чтобы сделать дочерний процесс независимым и не ожидается, чтобы присоединиться к родительскому. Таким образом, мы не должны присоединяться к дочернему процессу, и после этого нам приходится отрываться от основного преграда. так:

pthread_create(th, attr, what); 
pthread_detach(th); 
// and never join 

Еще может быть полезно вещи:
1. Если вы хотите добавить эффективность в приложение, я предлагаю не использовать исчерпывающее прослушивание наблюдения специального мероприятия сигнала как threadReady. Вместо этого используйте переменные условия в pthread или другие методы сигнализации, такие как gObject.
2. У вас есть данные, разделяемые между потоками, и он может столкнуться с проблемой взаимного исключения и другими проблемами, которые могут возникать в многопроцессорных или многопоточных приложениях. Вместо этого попытайтесь обработать это вручную, используя некоторые механизмы, такие как мьютекс или семафор переменные условия. С уважением.

Смежные вопросы