crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
eldar85
  опции профиля:
сообщение 17.8.2010, 19:02
Сообщение #1


программист
***

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

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




Репутация:   0  


странная проблема, при длительной работе программы в течении нескольких часов, прога вылетает.
я запускаю в несколько потоков и программа должна выполнять поиск в сети, ищет изменения на сайте, но эт о не столь важно... как сделать так что если уж к примеру вылетел один поток, чтобы остальные работали или чтобы вообще не вылетали при длительной работе... уже столько вариантов перебрал зараза и один хрен при длительной работе вылетает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.8.2010, 19:08
Сообщение #2


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Если потоки принадлежат одному процессу, то ошибка в одном потоке убьёт весь процесс. Лучше, конечно, искать ошибку )) Или, как вариант, сделать простенькую программку, которая будет запускать несколько таких процессов (то есть не потоки делать, а процессы) и перезапускать, если что
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.8.2010, 19:21
Сообщение #3


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

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

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




Репутация:   44  


Найти причину, т.е. ошибку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 17.8.2010, 19:53
Сообщение #4


программист
***

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

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




Репутация:   0  


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

а как лучше в многопоточных прогах ошибку через дебагер искать? просто запускать дебагера и смотреть что произойдет или как лучше?

я с дебагером просто почти не пользовался и то с однопоточными прогами...

а запуск потоков примерно так выглядет

void MainWindow::start()
{
    j=0;
    Thread *thread = new Thread[100];

    for(int i = 0; i < 100; i++)
    {
        connect(&thread[i], SIGNAL(counter()), this, SLOT(lcd()));
        connect(&thread[i], SIGNAL(shovT(QString)), this, SLOT(showT(QString)));

        thread[i].start();
        Sleep(100);

    }


это получается в одном процессе все потоки работают?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.8.2010, 19:58
Сообщение #5


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


И часто ты вызываешь MainWindow::start() ? :) А где массив удаляешь?

Конечно, в одном процессе

Но дело тут, похоже , в самом потоке - покажи его

Сообщение отредактировал Алексей1153 - 17.8.2010, 19:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 17.8.2010, 20:34
Сообщение #6


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

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Цитата(eldar85 @ 17.8.2010, 22:53) *
а как лучше в многопоточных прогах ошибку через дебагер искать? просто запускать дебагера и смотреть что произойдет или как лучше?

как обычно. просто у дебаггеров есть окно с выбором потоков. при паузе или брекпойнте останавливаются все потоки и ты можешь выбирать поток и он показывает тебе весь контекст этого потока. и у тебя там будет как минимум 101 поток :)
ты запусти для дебага хотя бы два потока. так виднее будет.
бага может быть вообще не связана с многопоточностью. запусти один поток и проверь - будет падать или нет.

и проще выложи код твоих потоков. так можно будет сказать, что там не так. у меня опыт разработки в параллельных вычислениях большой, я быстро обнаруживаю баги подобного рода.
основные причины, как правило:
- передача локальных переменных ссылками в поток (когда порождающий поток завершается или падает - дочерние потоки получают мусор в своих ссылках)
- использование статических переменных в потоках. можно, но опасно и геморно. надо понимать, что делаешь.
а так, многопоточные приложения лучше обязательно тестировать на многопроцессорных (многоядерных) компах. на одном проце многие баги могут просто не проявляться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 18.8.2010, 12:31
Сообщение #7


программист
***

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

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




Репутация:   0  


Mainwindow::start() в программе вызывается всего раз, но массив я вообще никак не чищу... а разве Qt сам не может очищать память?
и если честно я даже не знаю как удалить динамический массив...
возможен вылет программы из за переполнения памяти к примеру если в каждом потоке создается класс as_curl* curl = new as_curl; и никак не не удаляется?)
код сейчас выложу потока...

delete []thread;
вот так правильно будет?

нет, так точно не прокатит))) потоки убиваются сразу))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 12:37
Сообщение #8


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Нет, такой массив он не почистит. Qt массивы вообще не чистит - он объекты свои удаляет, и то не всегда )

удалить так
delete [] thread;


конечно убиваются - это надо делать, когда потоки уже не нужны :)

Сообщение отредактировал Алексей1153 - 18.8.2010, 12:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.8.2010, 12:38
Сообщение #9


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

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

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




Репутация:   44  


Цитата(Алексей1153 @ 18.8.2010, 13:37) *
удалить так
delete [] Thread;

В смысле?
Удалять по имени класса? :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 12:40
Сообщение #10


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


сделай так, раз массив не нужен
    Thread *thread = 0;

    for(int i = 0; i < 100; i++)
    {
    thread=new Thread(...указатель на главное окно...);
        connect(thread, SIGNAL(counter()), this, SLOT(lcd()));
        connect(thread, SIGNAL(shovT(QString)), this, SLOT(showT(QString)));

        thread->start();
        Sleep(100);
    }


BRE, очепятка ) Исправил
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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