Я пишу небольшое хобби-приложение на C ++ с использованием Qt.При запуске приложения необходимо прочитать некоторые файлы словарей, что занимает некоторое время, поэтому я создал собственный класс потока для анализа словарей в фоновом режиме:
class SetupThread : public QThread
{
Q_OBJECT
public:
SetupThread(QObject *p_parent);
void setDictOutputs(WordDictionary *word, KanjiDictionary *kanji, RadicalDictionary *rad);
void run()
{
emit message("Parsing JMdict dictionary...");
m_wordDict->parseDictionary("dictionaries/JMdict_e.xml");
emit message("Parsing KANJIDIC dictionary...");
m_kanjiDict->parseDictionary("dictionaries/kanjidic2.xml");
emit message("Parsing RADKFILEX dictionary...");
m_radDict->parseDictionary("dictionaries/radkfilex.utf8");
}
signals:
void message(const QString &p_msg);
private:
WordDictionary *m_wordDict;
KanjiDictionary *m_kanjiDict;
RadicalDictionary *m_radDict;
};
Три класса «Словарь» созданы мной ивсе они наследуют общий интерфейс, который включает в себя функциональность Q_OBJECT, чтобы сигнализировать основному классу через заголовок потока установки в режиме Qt :: QueuedConnection с обновлениями прогресса во время синтаксического анализа, поэтому он может отображать индикатор выполнения.Поток установки вызывается из конструктора основных классов следующим образом:
MainForm::MainForm(QWidget *parent, Qt::WFlags flags)
{
/* ... */
m_wordDict = new WordDictionary(this);
m_kanjiDict = new KanjiDictionary(this);
m_radDict = new RadicalDictionary(this);
m_setupThread = new SetupThread(this);
m_setupThread->setDictOutputs(m_wordDict, m_kanjiDict, m_radDict);
m_setupThread->start();
}
У меня возникли некоторые проблемы с аварийным завершением приложения при выходе, и я не мог понять, в чем проблема, поэтому я попытался запустить егов отладчике Visual C ++ 2008.Затем я получаю огромный сбой при запуске:
Необработанное исключение в 0x7568b727 в kanjiflash.exe: исключение Microsoft C ++: std :: исключение в ячейке памяти 0x024ffa1c ..
Трассировка стека показывает:
KernelBase.dll! 7568b727 ()
[Кадры ниже могут быть неправильными и / или отсутствующими, символы не загружены для KernelBase.dll]
KernelBase.dll! 7568b727 ()
msvcr90d.dll! _heap_alloc_dbg_impl (unsigned int nSize = 72, int nBlockUse = 1, const char * szFileName = 0x00000000, int nLine = 0, int * errno_tmp = 0x024ff7 + 0 * 0 + 0 + 0) + 0 + 0 + 0 + 0 + C + 0) + 8 + 0 + 0 + 0 C ++ C ++ C ++ 8) C ++) 81019 * msvcr90d.dll! _Nh_malloc_dbg_impl (без знака int nSize = 72, int nhFlag = 0, int nBlockUse = 1, const char * szFileName = 0x00000000, int nLine = 0, int * errno_tmp = 0x024ff9 + 8 * 10 192 0 ++ 10 10 0 + 219 0 8 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 9 0 8 8 9 8 8 8 8 8 8 8 8 8 8 8 8 8 0 8 8 8 8 8 8 8 8 8 8 8 8 0 8 8 8 8 строка на линии связи 0 0 0 0 0 232 0 10 0 0 239 09 239 0 8 8 0 10 19 на линии строк* msvcr90d.dll! _nh_malloc_dbg (без знака int nSize = 72, int nhFlag = 0, int nBlockUse = 1, const char * szFileName = 0x00000000, int nLine = 0) Строка 296 + 0x1d байт C ++
msvcr90d.dll!unsigned int nSize = 1) Строка 56 + 0x15 bytes C ++
020bea68 ()
kanjiflash.exe! SetupThread :: run () Строка 391 + 0x2c байт C ++
QtCored4.dll! QThreadPrivate :: start (void * arg = 0x020bd0c8) Строка 317 C ++
msvcr90d.dll! _callthreadstartex () Строка 348 + 0xf байт C
msvcr90d.dll! _threadstartex (void * ptd = 0x020bd8f0) Строка 331 C
kernel32.dll! 75593677 ()
ntdll.dll! 77739d72()
ntdll.dll! 77739d45 ()
В этой строке указана конкретная строка в SetupThread :: run (), где я пытаюсь запустить parseDictionary ("..."),Этот стек вызовов получается из-под Windows7 64bit.В Windows XP 32bit у меня была идентичная проблема, единственное отличие заключалось в том, что стек шел в конструктор QString (const char * ch) из SetupThread :: run (), где он жаловался и показывал, что буфер * ch равен несколькимсимволы мусора.
Теперь странно то, что это происходит только внутри отладчика.Конфигурации Debug и Release отлично работают вне отладчика.Возившись с приложением, исследующим это, я обнаружил и исправил ошибку, из-за которой я сначала использовал отладчик, но мне интересно, что на самом деле происходит и что я буду делать, если мне когда-нибудь понадобится отладчик.Поскольку я не совсем разбираюсь в многопоточном программировании, я не уверен, возможно ли вообще запустить их в отладчике, или, возможно, я делаю что-то не так, например, работаю над указателями основного класса в рабочем потоке(нарушение доступа?).Любое понимание высоко ценится.