сбой многопоточных приложений в режиме выпуска - PullRequest
0 голосов
/ 31 марта 2010

Я использую Visual Studio 2008 (программирование на языке с). У меня странная проблема. Я работаю с программой, в которой одновременно работают 2 потока: поток записи (с помощью звуковой карты для записи в память) и поток перевода (с помощью речевого механизма для распознавания слов). когда я запускаю свою программу в режиме отладки (он же устанавливает точку останова в коде), она работает отлично, однако, когда я запускаю в режиме отладки или в режиме выпуска (за пределами среды Visual Studio), происходит сбой и выдается следующее исключение: «Необработанное исключение в 0x7c911129 в LowLevel.exe: 0xC0000005: расположение чтения нарушения доступа 0x014c7245.» Мой стек выглядит:

LowLevel.exe! __ set_flsgetvalue () Строка 256 + 0xc байтов C
LowLevel.exe! _Isleadbyte_l (интермедиат c = 4359676, localeinfo_struct * locinfo = 0x00000001) Строка 57 C ++ LowLevel.exe! PlayDateOfExam (интермедиат option = 1) Строка 2240 + 0x7 байт C ++ LowLevel.exe! NSCThread (пусто * arg = 0x00000000) Строка 1585 + 0xb байт C ++ kernel32.dll! 7c80b729 ()
winmm.dll! 76b5b294 ()

Я использую следующий файл в моем проекте "nsc.lib" и WinMM.lib " Я не очень знаком с потоками, я использовал образец (который прекрасно работает) и построен на нем. Я видел похожий вопрос года на форуме, но я не совсем понял ответы, так как я не знаком с темами. Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

0 голосов
/ 01 апреля 2010

Я думаю, что, как вы сказали, и проблема, и это PlayDateOfExam, который удивляет меня, так как я вызываю эту функцию во всем своем коде. Код функции:

char* PlayDateOfExam(int option)
{

        char* WaveFileName;
        if (option==1)
        {
            int k=atoi(Global_Input.day);
            if (atoi(Global_Input.day)<10)
            {
                int day=atoi(Global_Input.day);
                day=day % 10;
                char* day_s=(char*)malloc(sizeof(char)*2);
                _itoa(day,day_s,10);
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,day_s);
                return (WaveFileName);
            }
            else
            {
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,Global_Input.day);
                return (WaveFileName);
            }

        }
        else if (option==2)
        {
            int k=atoi(Global_Input.month);
            if (atoi(Global_Input.month)<10)
            {
                int month=atoi(Global_Input.month);
                month=month % 10;
                char* month_s=(char*)malloc(sizeof(char)*2);
                _itoa(month,month_s,10);
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
                strcat(WaveFileName,month_s);
                return (WaveFileName);
            }
            else
            {
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
                strcat(WaveFileName,Global_Input.month);
                return (WaveFileName);
            }
    }
        else if (option==3)
        {
            WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
            strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
            strcat(WaveFileName,"2000+");
            return(WaveFileName);
        }
        else if (option==4)
        {
            int k=atoi(Global_Input.hour);
            if (atoi(Global_Input.hour)<10)
            {
                int hour=atoi(Global_Input.hour);
                hour=hour % 10;
                char* hour_s=(char*)malloc(sizeof(char)*2);
                _itoa(hour,hour_s,10);
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,hour_s);
                return (WaveFileName);
            }
            else
            {
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,Global_Input.hour);
                return (WaveFileName);
            }
    }
        else if (option==5)
        {
                int k=atoi(Global_Input.minute);
            if (atoi(Global_Input.minute)<10)
            {
                int minute=atoi(Global_Input.minute);
                minute=minute % 10;
                char* minute_s=(char*)malloc(sizeof(char)*2);
                _itoa(minute,minute_s,10);
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,minute_s);
                return (WaveFileName);
            }
            else
            {
                WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
                strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
                strcat(WaveFileName,Global_Input.minute);
                return (WaveFileName);
            }
        }
        else if (option==6)
        {
            WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\"));
            strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\");
            strcat(WaveFileName,Global_Input.class_location);
            return (WaveFileName);
        }
        else if (option==7)
        {
            WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\"));
            strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\");
            strcat(WaveFileName,Global_Input.class_number);
            return (WaveFileName);
        }
        return ("Error");
    }

Вызов функции: sndPlaySound (PlayDateOfExam (4), SND_SYNC); который написан в потоке, который работает. Я не знаю, почему в этом сегменте кода происходит сбой

0 голосов
/ 31 марта 2010

Если проблема обнаруживается только тогда, когда она не работает под отладчиком, то, скорее всего, она связана с синхронизацией. Посмотрите в PlayDateOfExam () на переменные, на которые ссылаются, и определите, с какой из них может быть связан другой поток.

Возможно, что (например) другой поток вмешивается в длину массива. В отладчике время таково, что вы ссылаетесь на эту длину до того, как другой поток ее коснется, и все в порядке. За пределами отладчика, когда указывается длина этого массива, он уже испорчен, и вы в конечном итоге перебираете границы массива. Невозможно сказать, какова реальная проблема, потому что не хватает информации, но это та проблема, которую вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...