Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QThread и Winpcap 
:(
    Опции темы
a1ien
Дата 24.9.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.6.2008

Репутация: нет
Всего: нет



Подскажите что я не так делаю
Код
void MainWindow::on_pushButton_clicked()
{
sniff = new Sniff();
sniff->start();
}

Код

#include <QThread>
#include "pcap.h"

class Sniff : public QThread
{
public:
    Sniff();
    virtual void run();
     friend void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

};

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
     qDebug("Ping 2");
    struct tm *ltime;
    char timestr[16];
    time_t local_tv_sec;

    /*
     * unused parameters
     */
    (VOID)(param);
    (VOID)(pkt_data);

    /* convert the timestamp to readable format */
    local_tv_sec = header->ts.tv_sec;
    ltime=localtime(&local_tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
    qDebug(QString("%1,%2 len:%3").arg(timestr).arg(header->ts.tv_usec).arg(header->len).toAscii());

}

void Sniff::run()
{
.....
                        qDebug("Ping 1");
                        pcap_loop(adhandle, 0, packet_handler, (u_char*)this);


}



Если в on_pushButton_clicked() просто вызвать sniff->run();
то qDebug("Ping 1"); , qDebug("Ping 2"); и пакеты ловятся.
А если через старт то он вобще не ловит ни одного пакета и вобще в  packet_handler не заходит.
Но до qDebug("Ping 1"); выполняется.
PM MAIL   Вверх
RedDigger
Дата 24.9.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 24.9.2010
Где: Москва

Репутация: нет
Всего: 1



А можешь объяснить чего ты хочешь добиться? Возможно целесообразней использовать QtConcurrent?

А на счет возможной причины в данном примере - В случае когда ты вызываешь 
Код

QThread::run()
 
- это не стартует новый поток. Он запускается в основном потоке и работает. Если же ты всетаки используешь его как реализацию потоков - используй функцию 
Код

QThread::start()

Она в свою очередь создает поток в начале которого вызывается функция run() которая ДОЛЖНА вызывать фукнцию exec() что вызывает старт работы потока. следовательно советы сводятся к двум:

1. добавить exec() в конец блока run()
2. убрать слово virtual из объявления функции run(). Объяснение - Таблица виртуальных методов

Удачи
PM MAIL Skype   Вверх
a1ien
Дата 24.9.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 2.6.2008

Репутация: нет
Всего: нет



Цитата

1. добавить exec() в конец блока run()
2. убрать слово virtual из объявления функции run(). Объяснение - Таблица виртуальных методов

Сделал.
Только вроде как в этом сымсла нету
так-как
1 pcap_loop и так делает бесконечный цикл
2 всеравно  вызывается то что нужно.
PM MAIL   Вверх
RedDigger
Дата 25.9.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 24.9.2010
Где: Москва

Репутация: нет
Всего: 1



Объясни еще раз саму задачу, которую нужно решить.. 
Данный вопрос не в том что есть бесконечный цикл или нет.. ты унаследовал для своего класса Qthread родителя.. следовательно хочешь сделать отдельный поток..  мой тебе совет - используй QtConcurrent.. намного проще запустить отдельный поток и не перегружать дополнительными данными код и память при выполнении... 
вот тебе пример использования - 
Код

QFuture<void> f = QtConcurrent::run(
                                 this, 
                                 &pcap_loop, 
                                 adhandle, 
                                 0, 
                                 packet_handler, 
                                 (u_char*)this);
while(!f.isFinished()) {
      qApp.processEvents();
}


код стартанет все твой безконечный цикл в отдельном потоке и все остальное будет отвечать.. 


PM MAIL Skype   Вверх
borisbn
Дата 25.9.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(RedDigger @  24.9.2010,  23:11 Найти цитируемый пост)
в начале которого вызывается функция run() которая ДОЛЖНА вызывать фукнцию exec() что вызывает старт работы потока.

если собираешься обрабатывать события от созданных в потоке объектов - то да, должна. В примере ТС ничего такого нет, поэтому в exec() нет никакого смысла. А использовать QtConcurent лучше для однообразной обработки большого количества одинаковых ( по структуре, а не по значению ) данных. А для запуска же какого-то действия в параллельном потоке как раз и используется QThread.

a1ien, я правильно понимаю, что ф-ция pcap_loop должна вызывать ф-цию packet_handler ? Пишет ли что-нибудь твоя IDE при запуске приложения и при нажатии кнопки в окне вывода ( Output в visual studio ) ?
И ещё. попробуй добавить Q_OBJECT в описание класса Sniff
Код

class Sniff : public QThread
{
Q_OBJECT
...


Это сообщение отредактировал(а) borisbn - 25.9.2010, 09:48


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.