crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Skier78rus
  опции профиля:
сообщение 13.1.2010, 10:47
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 13.1.2010
Пользователь №: 1368

Спасибо сказали: 0 раз(а)




Репутация:   0  


Подскажите пожалуйста.

Написал двупоточную программу для работы с прибором через сетевой интерфейс(UDP пакеты).
Соответственно первый поток интерфейсный, второй непосредственное получение данных.

Под данные выделен один здоровенный массив (40 Мб, больше просто данных никогда не будет).

Структура работы такая после получения данных поток работы с прибором говорит, что принят еще один пакет(или n пакетов) данных,
а интерфейсный поток входит в обработчик таймера(50 мс) и если есть новые пакеты обсчитывает их и выводит на экран.

И все было нормально пока я не дошел до нормального тестирования(суточного). И тут то и выяснилося, что переодически прога падает с сигналом SIGABRT, а в каком месте я понять не могу.
Подскажите как определить в какой функции падает. Проект под QT и под Linux у меня первый. Использую QT Creator 1.2, QT 4.5.3, gcc 4.4.3, Ubuntu 9.04.

Я пробовал через try catch, как бы делал это в студии, но как выяснилось тут они не работают...
В потоках естественно использую QMutex.

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

Раскрывающийся текст
(gdb) run ./AMK
`/home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK' has changed; re-reading symbols.
Starting program: /home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK ./AMK
[Thread debugging using libthread_db enabled]
[New Thread 0xb6af6920 (LWP 30410)]
[New Thread 0xb576bb90 (LWP 30411)]
[Thread 0xb576bb90 (LWP 30411) exited]
[New Thread 0xb576bb90 (LWP 30579)]
[Thread 0xb576bb90 (LWP 30579) exited]
[New Thread 0xb576bb90 (LWP 30805)]
[Thread 0xb576bb90 (LWP 30805) exited]
[New Thread 0xb576bb90 (LWP 30806)]
[Thread 0xb576bb90 (LWP 30806) exited]
[New Thread 0xb576bb90 (LWP 30807)]
[Thread 0xb576bb90 (LWP 30807) exited]
[New Thread 0xb576bb90 (LWP 30809)]
*** glibc detected *** /home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK: double free or corruption (fasttop): 0x0c2359f0 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb6f6a604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb6f6c5b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb714d231]
/usr/lib/libQtCore.so.4(_ZN20QEventDispatcherGlib24unregisterSocketNotifierEP15QSocketNot
ifier+0xdf)[0xb72f939f]
/usr/lib/libQtCore.so.4(_ZN15QSocketNotifier10setEnabledEb+0x3d)[0xb72e883d]
/usr/lib/libQtNetwork.so.4[0xb744f9aa]
/usr/lib/libQtNetwork.so.4[0xb7461739]
/usr/lib/libQtNetwork.so.4[0xb744e77b]
/usr/lib/libQtNetwork.so.4[0xb744fad6]
/usr/lib/libQtGui.so.4(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0xbc)[0x
b7621e9c]
/usr/lib/libQtGui.so.4(_ZN12QApplication6notifyEP7QObjectP6QEvent+0xbe)[0xb762a19e]
/usr/lib/libQtCore.so.4(_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0x7b)[0xb
72cda3b]
/usr/lib/libQtCore.so.4[0xb72f96ca]
/usr/lib/libglib-2.0.so.0(g_main_context_dispatch+0x1e8)[0xb6d51b88]
/usr/lib/libglib-2.0.so.0[0xb6d550eb]
/usr/lib/libglib-2.0.so.0(g_main_context_iteration+0x68)[0xb6d55268]
/usr/lib/libQtCore.so.4(_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17P
rocessEventsFlagEE+0x58)[0xb72f9438]
/usr/lib/libQtGui.so.4[0xb76c3365]
/usr/lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0
x4a)[0xb72cc06a]
/usr/lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xea)[0xb72
cc4aa]
/usr/lib/libQtGui.so.4(_ZN7QDialog4execEv+0x103)[0xb7b3c403]
/home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK[0x8050c47]
/home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK[0x8089f0f]
/usr/lib/libQtCore.so.4(_ZN14QMetaCallEvent13placeMetaCallEP7QObject+0x2b)[0xb72dc8fb]
/usr/lib/libQtCore.so.4(_ZN7QObject5eventEP6QEvent+0x2c0)[0xb72de3a0]
/usr/lib/libQtGui.so.4(_ZN7QWidget5eventEP6QEvent+0x50)[0xb7678440]
/usr/lib/libQtGui.so.4(_ZN11QMainWindow5eventEP6QEvent+0x77)[0xb7a700d7]
/usr/lib/libQtGui.so.4(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0xbc)[0x
b7621e9c]
/usr/lib/libQtGui.so.4(_ZN12QApplication6notifyEP7QObjectP6QEvent+0x1a2)[0xb762a282]
/usr/lib/libQtCore.so.4(_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0x7b)[0xb
72cda3b]
/usr/lib/libQtCore.so.4(_ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThre
adData+0x2a5)[0xb72ce695]
/usr/lib/libQtCore.so.4(_ZN16QCoreApplication16sendPostedEventsEP7QObjecti+0x2d)[0xb72ce8
8d]
/usr/lib/libQtCore.so.4[0xb72f97ef]
/usr/lib/libglib-2.0.so.0(g_main_context_dispatch+0x1e8)[0xb6d51b88]
/usr/lib/libglib-2.0.so.0[0xb6d550eb]
/usr/lib/libglib-2.0.so.0(g_main_context_iteration+0x68)[0xb6d55268]
/usr/lib/libQtCore.so.4(_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17P
rocessEventsFlagEE+0x58)[0xb72f9438]
/usr/lib/libQtGui.so.4[0xb76c3365]
/usr/lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0
x4a)[0xb72cc06a]
/usr/lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xea)[0xb72
cc4aa]
/usr/lib/libQtCore.so.4(_ZN16QCoreApplication4execEv+0xb9)[0xb72ce959]
/usr/lib/libQtGui.so.4(_ZN12QApplication4execEv+0x27)[0xb7621d17]
/home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK[0x80507b8]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb6f11775]
/home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK[0x80506d1]
======= Memory map: ========
08048000-080a0000 r-xp 00000000 08:06 3859576 /home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK
080a0000-080a1000 r--p 00057000 08:06 3859576 /home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK
080a1000-080a2000 rw-p 00058000 08:06 3859576 /home/bizon/work/2010/January/BIZON2010_MULTI_THREADS/AMK
080a2000-0b0a2000 rw-p 080a2000 00:00 0
0be4f000-0c282000 rw-p 0be4f000 00:00 0 [heap]
b4e00000-b4e21000 rw-p b4e00000 00:00 0
b4e21000-b4f00000 ---p b4e21000 00:00 0
b4f6b000-b4f6c000 ---p b4f6b000 00:00 0
b4f6c000-b5891000 rw-p b4f6c000 00:00 0
b5891000-b5d25000 rw-p b5891000 00:00 0
b5d25000-b5dbd000 r--p 00000000 08:05 89713 /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
b5dbd000-b5e1d000 rw-s 00000000 00:09 2293779 /SYSV00000000 (deleted)
b5e1d000-b5ea9000 r--p 00000000 08:05 89712 /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf
b5ea9000-b5efb000 r-xp 00000000 08:05 669681 /usr/lib/libtiff.so.4.2.1
b5efb000-b5efc000 ---p 00052000 08:05 669681 /usr/lib/libtiff.so.4.2.1
b5efc000-b5efe000 r--p 00052000 08:05 669681 /usr/lib/libtiff.so.4.2.1
b5efe000-b5eff000 rw-p 00054000 08:05 669681 /usr/lib/libtiff.so.4.2.1
b5eff000-b5f51000 r-xp 00000000 08:05 669956 /usr/lib/libQtSvg.so.4.5.0
b5f51000-b5f52000 ---p 00052000 08:05 669956 /usr/lib/libQtSvg.so.4.5.0
b5f52000-b5f53000 r--p 00052000 08:05 669956 /usr/lib/libQtSvg.so.4.5.0
b5f53000-b5f54000 rw-p 00053000 08:05 669956 /usr/lib/libQtSvg.so.4.5.0
b5f54000-b5f84000 r-xp 00000000 08:05 671064 /usr/lib/liblcms.so.1.0.18
b5f84000-b5f85000 r--p 00030000 08:05 671064 /usr/lib/liblcms.so.1.0.18
b5f85000-b5f86000 rw-p 00031000 08:05 671064 /usr/lib/liblcms.so.1.0.18
b5f86000-b5f88000 rw-p b5f86000 00:00 0
b5f88000-b5ff3000 r-xp 00000000 08:05 671097 /usr/lib/libmng.so.1.1.0.9
b5ff3000-b5ff6000 rw-p 0006a000 08:05 671097 /usr/lib/libmng.so.1.1.0.9
b6006000-b6025000 r-xp 00000000 08:05 671048 /usr/lib/libjpeg.so.62.0.0
b6025000-b6026000 rw-p 0001e000 08:05 671048 /usr/lib/libjpeg.so.62.0.0
b6029000-b602d000 r-xp 00000000 08:05 34838 /usr/lib/qt4/plugins/imageformats/libqtiff.so
b602d000-b602e000 r--p 00003000 08:05 34838 /usr/lib/qt4/plugins/imageformats/libqtiff.so
b602e000-b602f000 rw-p 00004000 08:05 34838 /usr/lib/qt4/plugins/imageformats/libqtiff.so
b602f000-b6034000 r-xp 00000000 08:05 34837 /usr/lib/qt4/plugins/imageformats/libqmng.so
b6034000-b6035000 r--p 00004000 08:05 34837 /usr/lib/qt4/plugins/imageformats/libqmng.so
b6035000-b6036000 rw-p 00005000 08:05 34837 /usr/lib/qt4/plugins/imageformats/libqmng.so
b6036000-b603f000 r-xp 00000000 08:05 34836 /usr/lib/qt4/plugins/imageformats/libqjpeg.so
b603f000-b6040000 r--p 00008000 08:05 34836 /usr/lib/qt4/plugins/imageformats/libqjpeg.so
b6040000-b6041000 rw-p 00009000 08:05 34836 /usr/lib/qt4/plugins/imageformats/libqjpeg.so
b6041000-b6047000 r-xp 00000000 08:05 34835 /usr/lib/qt4/plugins/imageformats/libqico.so
b6047000-b6048000 r--p 00005000 08:05 34835 /usr/lib/qt4/plugins/imageformats/libqico.so
b6048000-b6049000 rw-p 00006000 08:05 34835 /usr/lib/qt4/plugins/imageformats/libqico.so
b6049000-b60e1000 r--p 00000000 08:05 89713 /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
b60e1000-b6109000 r-xp 00000000 08:05 693548 /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so
b6109000-b610a000 r--p 00027000 08:05 693548 /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so
b610a000-b610b000 rw-p 00028000 08:05 693548 /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so
b610b000-b6112000 r-xp 00000000 08:05 671078 /usr/lib/libltdl.so.7.2.0
b6112000-b6113000 r--p 00006000 08:05 671078 /usr/lib/libltdl.so.7.2.0
b6113000-b6114000 rw-p 00007000 08:05 671078 /usr/lib/libltdl.so.7.2.0
b6114000-b6120000 r-xp 00000000 08:05 671351 /usr/lib/libtdb.so.1.1.3
b6120000-b6121000
Program received signal SIGABRT, Aborted.
[Switching to Thread 0xb6af6920 (LWP 30410)]
0xb7f04430 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7f04430 in __kernel_vsyscall ()
#1 0xb6f266d0 in raise () from /lib/tls/i686/cmov/libc.so.6
#2 0xb6f28098 in abort () from /lib/tls/i686/cmov/libc.so.6
#3 0xb6f6424d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4 0xb6f6a604 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5 0xb6f6c5b6 in free () from /lib/tls/i686/cmov/libc.so.6
#6 0xb714d231 in operator delete () from /usr/lib/libstdc++.so.6
#7 0xb72f939f in QEventDispatcherGlib::unregisterSocketNotifier () from /usr/lib/libQtCore.so.4
#8 0xb72e883d in QSocketNotifier::setEnabled () from /usr/lib/libQtCore.so.4
#9 0xb744f9aa in ?? () from /usr/lib/libQtNetwork.so.4
#10 0xb7461739 in ?? () from /usr/lib/libQtNetwork.so.4
#11 0xb744e77b in ?? () from /usr/lib/libQtNetwork.so.4
#12 0xb744fad6 in ?? () from /usr/lib/libQtNetwork.so.4
#13 0xb7621e9c in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4
#14 0xb762a19e in QApplication::notify () from /usr/lib/libQtGui.so.4
#15 0xb72cda3b in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4
#16 0xb72f96ca in ?? () from /usr/lib/libQtCore.so.4
#17 0xb6d51b88 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#18 0xb6d550eb in ?? () from /usr/lib/libglib-2.0.so.0
#19 0xb6d55268 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#20 0xb72f9438 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4
#21 0xb76c3365 in ?? () from /usr/lib/libQtGui.so.4
#22 0xb72cc06a in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4
#23 0xb72cc4aa in QEventLoop::exec () from /usr/lib/libQtCore.so.4
#24 0xb7b3c403 in QDialog::exec () from /usr/lib/libQtGui.so.4
#25 0x08050c47 in MainWindow::on_connectButton_activated (this=0xbfb255a8) at mainwindow.cpp:470
#26 0x08089f0f in MainWindow::qt_metacall (this=0xbfb255a8, _c=QMetaObject::InvokeMetaMethod, _id=5, _a=0xc031840)
at moc_mainwindow.cpp:85
#27 0xb72dc8fb in QMetaCallEvent::placeMetaCall () from /usr/lib/libQtCore.so.4
#28 0xb72de3a0 in QObject::event () from /usr/lib/libQtCore.so.4
#29 0xb7678440 in QWidget::event () from /usr/lib/libQtGui.so.4
#30 0xb7a700d7 in QMainWindow::event () from /usr/lib/libQtGui.so.4
#31 0xb7621e9c in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4
#32 0xb762a282 in QApplication::notify () from /usr/lib/libQtGui.so.4
#33 0xb72cda3b in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4
#34 0xb72ce695 in QCoreApplicationPrivate::sendPostedEvents () from /usr/lib/libQtCore.so.4
#35 0xb72ce88d in QCoreApplication::sendPostedEvents () from /usr/lib/libQtCore.so.4
#36 0xb72f97ef in ?? () from /usr/lib/libQtCore.so.4
---Type <return> to continue, or q <return> to quit---
#37 0xb6d51b88 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#38 0xb6d550eb in ?? () from /usr/lib/libglib-2.0.so.0
#39 0xb6d55268 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#40 0xb72f9438 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4
#41 0xb76c3365 in ?? () from /usr/lib/libQtGui.so.4
#42 0xb72cc06a in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4
#43 0xb72cc4aa in QEventLoop::exec () from /usr/lib/libQtCore.so.4
#44 0xb72ce959 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4
#45 0xb7621d17 in QApplication::exec () from /usr/lib/libQtGui.so.4
#46 0x080507b8 in main (argc=Cannot access memory at address 0x76ca
) at main.cpp:14


Самое главное,что программа может работать несколько суток без сбоя, а может раз в несколько часов вылетать.
Облазил кучу форумов но так и не понял, как найти место вылета..


Посоветуйте куда копать..... 8(

Заранее спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V  < 1 2 3 >  
Начать новую тему
Ответов (10 - 19)
BRE
  опции профиля:
сообщение 13.1.2010, 17:58
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


2 Skier78rus
Ну тогда пора код выкладывать. ;)
Для начала интересно взглянуть на main.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 13.1.2010, 17:58
Сообщение #12


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


в какой то контейнер одновременно в двух потоках обращаешься (меняешь размер)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Skier78rus
  опции профиля:
сообщение 13.1.2010, 18:12
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 13.1.2010
Пользователь №: 1368

Спасибо сказали: 0 раз(а)




Репутация:   0  


Везде исрользуеться QMutex мог конечно налажать где-то, но я две недели уже глюк ищу....
И все что в потоке крутиться(функция не большая) засунул в один большой Мутекс....


код main.cpp
#include....


int main(int argc, char *argv[]){
    QApplication a(argc,argv);
    MainWindow w;
    w.show();
    return a.exec();
}


QApplication a(argc,argv); вот эта строка если в valgrinde смотреть со всеми ворнингами не нравиться....


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

размер ничего не меняю.....есть один массив глобальный(40 Мб) в который я пишу и из которого читаю.....
И выделенные еще 5 массивов в конструкторе диалога.....они убиваються в деструкторе....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 13.1.2010, 18:40
Сообщение #14


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


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

в студии то чего собрать не хочешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Skier78rus
  опции профиля:
сообщение 13.1.2010, 19:03
Сообщение #15


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 13.1.2010
Пользователь №: 1368

Спасибо сказали: 0 раз(а)




Репутация:   0  


мне под Линух надо......начальство сказало, что пора осваивать.... <_<
Или Вы имеете ввиду только для поиска бага? :blink:


Это функция которая вызываеться по таймеру в основном потоке, кроме нее больше ничего не выполняеться(только в главном окне ожидание результата dialog.exec)

Раскрывающийся текст

void workDlg::timerDataOk(){
    try{
        qint32 iTmpCountRealiz;
        qint32 iTmpReciveSize,tmpMathCount;
        qint8 iTmpState,iTmpPrevState;
        QString tmpStr,tmpStr1;
        double dTmpSin=0,dTmpCos=0;
        long double MO=0,DISP=0,MO2=0,dSin=0,dCos=0,POROG=0,dMaxAmpl=0,DISP1=0;
        qint16 iMax=-1,iMin=-1,iNumber=0;
        QString strMyTime;
        myMutex.lock();
            iTmpCountRealiz=iCountRealiz;
            iTmpReciveSize=iReciveSize;
            iTmpState=iState;
            iTmpPrevState=iPrevState;
        myMutex.unlock();
        if(iTmpState==iTmpPrevState && iTmpState!=UNKNOWN_STATE && iTmpPrevState!=UNKNOWN_STATE){
            iCountState++;
        }
        if(iTmpState!=iTmpPrevState){
            iCountState=0;
            iTmpPrevState=iTmpState;
            myMutex.lock();
                iPrevState=iTmpPrevState;
            myMutex.unlock();
        }
        if(iCountState==ERROR_COUNT){
            bInit=false;
            if(iTmpState==CONNECT_SEND){
                m_ui->testLabel->setText("Нет ответа от БИЗОНА");
            }
            else if(iTmpState==PARAM_SEND){
                m_ui->testLabel->setText("Ошибка передачи параметров инициализации");
            }
            else if(iTmpState==START_SEND){
                m_ui->testLabel->setText("Ошибка начала получения данных");
            }
            else if(iTmpState==DATA_RECIVE){
                m_ui->testLabel->setText("Ошибка при получения данных");
            }
        }
        tmpMathCount=iCountMathRealiz;
        if(SAVE_WORK_DEBUG)
            AddDebugFile(fName," In timer");
        if( ((iTmpCountRealiz-iCountMathRealiz)>=settingsStruct.soundingStruct.iCount)){//переписать условие добавить было iTmpCountRealiz%settingsStruct.soundingStruct.iCount
            if(SAVE_WORK_DEBUG)
                AddDebugFile(fName," In if");
            while(iCountMathRealiz<(iTmpCountRealiz-iTmpCountRealiz%settingsStruct.soundingStruct.iCount)){
                if(SAVE_WORK_DEBUG)
                    AddDebugFile(fName," In while");
                myTime = QTime::currentTime();
                strMyTime=myTime.toString("ss:zzz")+"  ";
                MO=0;
                DISP=0;
                MO2=0;
                if(settingsStruct.soundingStruct.iCount>1){//усреднение если неоходимо
                    for(qint16 i=DATA_SDVIG;i<iTmpReciveSize-2;i+=4){
                        dTmpCos=0;
                        dTmpSin=0;
                        for(qint16 iC=0;iC<settingsStruct.soundingStruct.iCount;iC++){
                            dTmpCos+=((reciveBuffer[(iCountMathRealiz+iC)*(iTmpReciveSize)+i+1]<<8)+reciveBuffer[(iCountMathRealiz+iC)*(iTmpReciveSize)+i]);
                            dTmpSin+=((reciveBuffer[(iCountMathRealiz+iC)*(iTmpReciveSize)+i+2+1]<<8)+reciveBuffer[(iCountMathRealiz+iC)*(iTmpReciveSize)+i+2]);
                        }
                        dTmpCos/=settingsStruct.soundingStruct.iCount;
                        dTmpSin/=settingsStruct.soundingStruct.iCount;
                        reciveBuffer[iCountMathRealiz*iTmpReciveSize+i]=(qint8)dTmpCos;
                        reciveBuffer[iCountMathRealiz*iTmpReciveSize+i+1]=(qint8)((qint32)dTmpCos>>8);
                        reciveBuffer[iCountMathRealiz*iTmpReciveSize+i+2]=(qint8)dTmpSin;
                        reciveBuffer[iCountMathRealiz*iTmpReciveSize+i+3]=(qint8)((qint32)dTmpSin>>8);
                        dTmpCos=0;
                        dTmpSin=0;
                    }
                }
                if(SAVE_WORK_DEBUG)
                    AddDebugFile(fName," Usred");
                //*****************MO and DISP********* вся математика
                for(qint16 i=DATA_SDVIG;i<iTmpReciveSize-2;i+=4){//
                    dCos=((reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i+1]<<8)+reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i]);
                    dSin=((reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i+2+1]<<8)+reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i+2]);
                    MO+=sqrt((double)(dSin*dSin+dCos*dCos));
                    MO2+=(dSin*dSin+dCos*dCos);

                }
                if(((iTmpReciveSize-8)/4) != 0){
                    MO/=((iTmpReciveSize-8)/4);///1
                    DISP1/=((iTmpReciveSize-8)/4);
                    MO2/=((iTmpReciveSize-8)/4);//130
                }
                DISP=qAbs(MO2-MO*MO);
                POROG=MO+(DISP*settingsStruct.ionogramStruct.fCoeff);
                POROG=400;
                qint32 iNumData=(quint16)((reciveBuffer[(iCountMathRealiz)*(iTmpReciveSize)+5]<<8)+(quint8)reciveBuffer[(iCountMathRealiz)*(iTmpReciveSize)+4]);
                if(SAVE_WORK_DEBUG)
                    AddDebugFile(fName," MO Disp");
                //*********svertka and *********************
                for(qint16 i=DATA_SDVIG;i<(iTmpReciveSize-2)-MANIP_SIZE*4;i+=4){
                    iNumber=(i-DATA_SDVIG)/4;
                    iConvolutionRe[iNumber]=0;
                    iConvolutionIm[iNumber]=0;

                    for(qint16 j=0;j<MANIP_SIZE;j++){
                        iConvolutionRe[iNumber]+=iManipSignal[j]*((reciveBuffer[(iCountMathRealiz)*iTmpR
eciveSize+i+1+j*4]<<8)+reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i+j*4]);
                        iConvolutionIm[iNumber]+=iManipSignal[j]*((reciveBuffer[(iCountMathRealiz)*iTmpR
eciveSize+i+2+1+j*4]<<8)+reciveBuffer[(iCountMathRealiz)*iTmpReciveSize+i+2+j*4]);
                    }
                    iConvolutionAmpl[iNumber]=sqrt(iConvolutionRe[iNumber]*iConvolutionRe[iNumber]+i
ConvolutionIm[iNumber]*iConvolutionIm[iNumber]);
                    if( iConvolutionAmpl[iNumber]>POROG && iMin==-1){
                        iMin=iNumber;
                        dMaxAmpl=iConvolutionAmpl[iNumber];
                    }
                    if(iMin!=-1){
                        if(iConvolutionAmpl[iNumber]>dMaxAmpl)
                            dMaxAmpl=iConvolutionAmpl[iNumber];
                    }
                    if(iConvolutionAmpl[iNumber]<POROG && iMin!=-1 && iMax==-1){
                        iMax=iNumber;
                        ionStruct.freq[ionStruct.clv]=(settingsStruct.soundingStruct.iStartFreq+settings
Struct.soundingStruct.iStepFreq*(iNumData/settingsStruct.soundingStruct.iCount))*1000;
                        ionStruct.startHeight[ionStruct.clv]=iMin*1.5+settingsStruct.soundingStruct.iSta
rtHei;
                        ionStruct.endHeight[ionStruct.clv]=iMax*1.5+settingsStruct.soundingStruct.iStart
Hei;
                        ionStruct.amp[ionStruct.clv] = dMaxAmpl;
                        ionStruct.height[ionStruct.clv]=POROG;
                        ionStruct.clv++;
                        iMin=-1;
                        iMax=-1;
                        dMaxAmpl=0;
                    }
                    if(((i+4) >= (iTmpReciveSize-2)-MANIP_SIZE*4) && iMin!=-1){
                        iMax=iNumber;
                        ionStruct.freq[ionStruct.clv]=(settingsStruct.soundingStruct.iStartFreq+settings
Struct.soundingStruct.iStepFreq*(iNumData/settingsStruct.soundingStruct.iCount))*1000;
                        ionStruct.startHeight[ionStruct.clv]=iMin*1.5+settingsStruct.soundingStruct.iSta
rtHei;
                        ionStruct.endHeight[ionStruct.clv]=iMax*1.5+settingsStruct.soundingStruct.iStart
Hei;
                        ionStruct.amp[ionStruct.clv] = dMaxAmpl;
                        ionStruct.height[ionStruct.clv]=POROG;
                        ionStruct.clv++;
                        iMin=-1;
                        iMax=-1;
                        dMaxAmpl=0;
                    }
                }
        //Конец математики
                if(SAVE_WORK_DEBUG)
                    AddDebugFile(fName," Svertka");

                iCountMathRealiz+=settingsStruct.soundingStruct.iCount;//
                tmpStr="Полученике данных: ";
                tmpStr1.setNum(iCountMathRealiz);
                tmpStr+=tmpStr1;
                m_ui->testLabel->setText(tmpStr);
            }
        }//if %
        if(iCountMathRealiz!=tmpMathCount){//если что-то обсчитал, то вывод на экран
            m_ui->ciFrame->update();
        }
        if(!bStartUdp && !bInit /*&& (iCountMathRealiz == (iTmpCountRealiz) || iCountState==ERROR_COUNT)*/){//Проверка пора ли закончить или нет
            m_ui->ciFrame->update();
            mathTimer->stop();
            if(myThread.isRunning()){
                myThread.stop();
                myThread.wait();
            }
            if(ionStruct.clv!=0)
                saveIonFile();
            m_ui->rEdit->setText(aaa);
            if( iCountState==0)
                m_ui->testLabel->setText("БИЗОН остановлен");
            else
                m_ui->testLabel->setText("БИЗОН остановлен c ошибкой");
            iCountState=0;
            if(IS_SOURCE_SAVE){
                QFile file("SourceData.DAT");
                if(!file.open(QIODevice::WriteOnly)){
                }
                else{
                    QString fStr,fStr1;
                    for(qint16 i=0;i<iTmpCountRealiz;i++){
                        fStr="Realiz № ";
                        fStr1.setNum(i+1);
                        fStr+=fStr1+'\n';
                        file.write(fStr.toLocal8Bit());
                        for(qint16 j=DATA_SDVIG;j<iTmpReciveSize-2;j+=4){
                            fStr="";
                            fStr.setNum((j-DATA_SDVIG)/4);
                            dCos=((reciveBuffer[(i)*iTmpReciveSize+j+1]<<8)+reciveBuffer[(i)*iTmpReciveSize+j]);
                            fStr1.setNum((qint32)dCos);
                            fStr+='\t'+fStr1+'\t';
                            dSin=((reciveBuffer[(i)*iTmpReciveSize+j+2+1]<<8)+reciveBuffer[(i)*iTmpReciveSize+j+2]);
                            fStr1.setNum((qint32)dSin);
                            fStr+=fStr1+'\n';
                            file.write(fStr.toLocal8Bit());
                        }
                    }
                    file.close();
                }
            }
            iCountState=0;
        }
        if(bStartUdp){//начало всей работы 
            m_ui->ciFrame->update();
           
            bStartUdp=false;
            if(!IS_TIMER_EMULATION){//need !                   !!!!!!!!!!!!!!!!!!!!!!!!!!!
                if(myThread.isRunning()){
                    myThread.stop();
                    myThread.wait();
                }
                myThread.start(QThread::HighPriority);//QThread::NormalPriority  TimeCriticalPriority
            }
            else{
                iState=CONNECT_SEND;
                bInit=true;
                emulationTimer->start(1000/settingsStruct.soundingStruct.iPulseFreq);
            }
            m_ui->testLabel->setText("Соединение с БИЗОНОМ");
        }
        if(SAVE_WORK_DEBUG)
            AddDebugFile(fName," End");
    }
    catch(...){
         m_ui->testLabel->setText("Ошибка обработки даных!!!!!!!!!!!");
    }
}




А это функция самого потока.....

Раскрывающийся текст
void GetDataThread::run(){
    QByteArray bArray;
    QHostAddress hAddress;
    qint16 iPort;
    qint32 iTmpCountRealiz,iTmpReciveSize;
    QString strMyTime=thTime.toString("ss:zzz")+"  ";
    QHostAddress sender;
    quint16 senderPort;
    quint16 tmp;
    QString strPriv="";
    char toSend[100];
    QString text,text1;
    quint16 iTmp=0;
    QTime myTime;
    qint16 tmpSig=0;
    quint8 iSdvig;
    qint64 iRSize=-1;
    QString fName="1thread.dat";
    ResetDebugFile(fName);
    //AddDebugFile(fName," In Thread");
    bInit=true;
    myMutex.lock();
        iState=CONNECT_SEND;
        iPrevState=CONNECT_SEND;
        hAddress=QHostAddress(settingsStruct.connectStruct.strAddress);
        iPort=settingsStruct.connectStruct.iPort;
    myMutex.unlock();
    bArray.clear();
    bArray[0]=0xA0;
    udpSocket->writeDatagram(bArray.data(), bArray.size(),hAddress,iPort);
    while(!stoped){
        if(!IS_EMULATION){
            myMutex.lock();
                iTmpCountRealiz=iCountRealiz;
            myMutex.unlock();
            while (udpSocket->hasPendingDatagrams()  && (iTmpCountRealiz < (settingsStruct.soundingStruct.iCountFreq*settingsStruct.soundingStruct.iCoun
t)) ) {
                myMutex.lock();
                thTime = QTime::currentTime();
                iTmpReciveSize=udpSocket->pendingDatagramSize();//4000;
                    iRSize=udpSocket->readDatagram(reciveBuffer+(iTmpCountRealiz*iMathReciveSize),udpSocket->pendingDatagramSize(),&sender,&senderPort);//вставил iMathReciveSize 
                if(iRSize!=-1){
                if(reciveBuffer[iTmpCountRealiz*iMathReciveSize]== (char)0xB0){
                    bInit=true;  
                    for(int i=1;i<iMathReciveSize-2;i++){
                        strPriv+=reciveBuffer[iTmpCountRealiz*iMathReciveSize+i];
                    }
                    if(true/*(quint8)reciveBuffer[iTmpCountRealiz*iMathReciveSize+24]==3 || (quint8)reciveBuffer[iTmpCountRealiz*iMathReciveSize+24]==7*/){
                        //m_ui->testLabel->setText(strPriv);
                        toSend[0]=0xA1;
                        toSend[2]=(qint8)(((settingsStruct.soundingStruct.iStartFreq)>>8));
                        toSend[1]=(qint8)(settingsStruct.soundingStruct.iStartFreq);
                        toSend[4]=(qint8)((settingsStruct.soundingStruct.iEndFreq)>>8);
                        toSend[3]=(qint8)((settingsStruct.soundingStruct.iEndFreq));
                        toSend[6]=(qint8)((settingsStruct.soundingStruct.iStepFreq)>>8);
                        toSend[5]=(qint8)((settingsStruct.soundingStruct.iStepFreq));
                        toSend[8]=(qint8)(settingsStruct.soundingStruct.iStartHei>>8);
                        toSend[7]=(qint8)(settingsStruct.soundingStruct.iStartHei);
                        toSend[10]=(qint8)(settingsStruct.soundingStruct.iEndHei>>8);
                        toSend[9]=(qint8)(settingsStruct.soundingStruct.iEndHei);
                        toSend[11]=(qint8)(100/settingsStruct.soundingStruct.iPulseFreq);
                        toSend[12]=(qint8)(settingsStruct.soundingStruct.iCount);
                        toSend[13]=(qint8)(settingsStruct.soundingStruct.iManipCode);
                        tmp=(settingsStruct.soundingStruct.iStartHei*2*10000)/300000;
                        udpSocket->writeDatagram(toSend, 14,QHostAddress(settingsStruct.connectStruct.strAddress),settingsStruct.connectS
truct.iPort);
                        iState=PARAM_SEND;
                    }
                    else{
                            bInit=false;
                    }
                }
                else if(reciveBuffer[iTmpCountRealiz*iMathReciveSize]== (char)0xB3){
                    toSend[0]=0xA2;
                    udpSocket->writeDatagram(toSend,1,QHostAddress(settingsStruct.connectStruct.strAddress),
settingsStruct.connectStruct.iPort);
                    iState=START_SEND;
                }
                else if(reciveBuffer[iTmpCountRealiz*iMathReciveSize]==(char) 0xB1){//При полученииданных всегда попадаем сюда
                    iState=DATA_RECIVE;
                    PrevState=DATA_ERROR;
                    iTmpCountRealiz++;
                    if(iMathReciveSize!=iTmpReciveSize)//???????????????????????????????or do exit????????????
                        iTmpReciveSize=iMathReciveSize;
                    if(iTmpCountRealiz ==(settingsStruct.soundingStruct.iCountFreq*settingsStruct.soundingStruct.iCoun
t
)){
                        toSend[0]=0xA3;
                        udpSocket->writeDatagram(toSend,1,QHostAddress(settingsStruct.connectStruct.strAddress),
settingsStruct.connectStruct.iPort);
                        iState=UNKNOWN_STATE;
                        bInit=false;
                    }
                }
                }//if iRSize
                else{
                    AddDebugFile(fName," ErrorRecive Data");
                }
                iReciveSize=iTmpReciveSize;
                iCountRealiz=iTmpCountRealiz;
                msleep(1);
            }
            msleep(1);
        }
        else{//Это эмуляция прибора с ней ни одного сбоя не поймал
            myMutex.lock();
            iState=CONNECT_SEND;
            if((iState==CONNECT_SEND ||  iState==DATA_RECIVE)&& iCountRealiz<settingsStruct.soundingStruct.iCountFreq*settingsStruct.soundingStruct.iCoun
t
){

                iSdvig=(iCountRealiz/settingsStruct.soundingStruct.iCount);//(iMathReciveSize-8)/16;//(iMathReciveSize-8)/4-MANIP_SIZE*2;//iCountRealiz*3;
                reciveBuffer[iCountRealiz*iMathReciveSize]=0XB1;
                reciveBuffer[iCountRealiz*iMathReciveSize+4]=(qint8)(iCountRealiz);
                reciveBuffer[iCountRealiz*iMathReciveSize+5]=(qint8)((iCountRealiz)>>8);

                for(qint16 k=DATA_SDVIG;k<iMathReciveSize*2-2;k+=4){
                    tmpSig=10+10*sin(2*3.14*(k-6)*5/(4*50));
                    reciveBuffer[iCountRealiz*iMathReciveSize+k]=(qint8)tmpSig;
                    reciveBuffer[iCountRealiz*iMathReciveSize+k+1]=(qint8)(tmpSig>>8);
                    reciveBuffer[iCountRealiz*iMathReciveSize+k+2]=(qint8)tmpSig;
                    reciveBuffer[iCountRealiz*iMathReciveSize+k+3]=(qint8)(tmpSig>>8);
                }

                iCountRealiz++;
                iReciveSize=iMathReciveSize;
                iState=DATA_RECIVE;
                iPrevState=DATA_ERROR;
            }
            else if(iCountRealiz>=settingsStruct.soundingStruct.iCountFreq*settingsStruct.soundingStruct.iCou
n
t){
                iState=UNKNOWN_STATE;
                bInit=false;
            }
            myMutex.unlock();
            msleep(1);
        }
    }
    bInit=false;
    stoped=false;
}



Цитата(kuler @ 13.1.2010, 18:40) *
так может обращаешься в потоках с разным кодом (главный и вспомогательный), тогда мютех на функцию потока не поможет


А вот этого я не понял.....В одном потоке создаеться другой, а мьютекс объявлен как глобальный.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 13.1.2010, 19:13
Сообщение #16


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Skier78rus @ 13.1.2010, 19:03) *
Или Вы имеете ввиду только для поиска бага?

ага

говнокод ужаснейший. Надо разбить на методы, а между ними писать в дебаг файл, при вылете смотришь что прошло а до чего не дошло. Уже чтото.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Skier78rus
  опции профиля:
сообщение 13.1.2010, 19:20
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 13.1.2010
Пользователь №: 1368

Спасибо сказали: 0 раз(а)




Репутация:   0  


Про код соглашусь...... :(

Я просто поудалял, там есть функция AddDebugFile, пытался по ней невышло.....

Там с постом какая-то проблема,надо нижние два раскрывающиеся тексты смотреть.....

А как qt к студии прикрутить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.1.2010, 23:15
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Skier78rus, смотри Справка по кнопкам и тэгам форума. код читать в виде простого текста тяжело.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 14.1.2010, 14:40
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 60
Регистрация: 24.12.2009
Пользователь №: 1332

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Skier78rus @ 13.1.2010, 16:49) *
в Линухе при ошибках посылаються сигналы(типо SIGABRT) и никаких exceptions не происходит.

Это я вычитал в инете, когда столкнулся с проблеммой

если вы не обрабатываете иксепшены в программе то по умолчанию она завершает работу (т.е. SIGABRT). Если перехватываете то можете как угодно её обрабатывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Skier78rus
  опции профиля:
сообщение 14.1.2010, 18:28
Сообщение #20


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 13.1.2010
Пользователь №: 1368

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(azure @ 14.1.2010, 14:40) *
Цитата(Skier78rus @ 13.1.2010, 16:49) *
в Линухе при ошибках посылаються сигналы(типо SIGABRT) и никаких exceptions не происходит.

Это я вычитал в инете, когда столкнулся с проблеммой

если вы не обрабатываете иксепшены в программе то по умолчанию она завершает работу (т.е. SIGABRT). Если перехватываете то можете как угодно её обрабатывать.


Вот в том-то и проблемма.....я не знаю способов перехватить ексепшен, кроме как try cath, который не ловит ничего......
Я может быть чего-то не понимаю или где-нибудь забыл поставить галочку нужную....но ничего он не ловит...
Если Вы знаете другой метод отлова исключений подскажите пожалуйста буду очень признателен!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 18:50