Re[7]: Определение имени хоста по IP в Qt 4.3.3
От: Stuw  
Дата: 27.02.08 14:40
Оценка:
Здравствуйте, vasilchmax

V>Я в многопоточном программировании не очень (так что сильно не бейте ), поэтому возможно (точнее наверняка ) что-то сделал не так. При таком коде все работает, но судя по всему неправильно. Потоки не получают свой цикл обработки событий, т.к. главный поток время от времени виснет И еще одно, почему-то после закрытия программы выпадает сообщение об ошибке "Cannot send event to objects owned by other thread".


Проблема с потоками, если я не ошибаюсь в том, что ты устанавливаешь сигналы не в главном потоке. Вынеси инициализацию сигналов из функции run.
И почитай про многопоточность в Qt


Теперь про поиск.
Ты ищешь по фтп и пытаешься соединиться с фтп сервером?
У тебя запускается 254 дополнительных потока — это слишком круто для системы. У тебя все остальные приложения нормально работают, когда начинает выполняться этот код?

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

2. Широковещательный пинг (на крайняк просто пинг)
Проблема: файрволы

3. Использование протоколов, которые подняты на всех компах локалки (а ля смб)

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

б. Сначала смотреть ARP таблицу

Вот результаты поиска по этому сайту.
WNetOpenEnum, WNetEnumResource и WNetCloseEnum. Но это работает только если включен NETBIOS через TCP/IP
Автор: valager
Дата: 29.03.07

Вывод всех компьютеров сети
Автор: bacho_sun
Дата: 17.11.05

список включенных компьютеров рабочей группы
Автор: Mel
Дата: 28.10.03
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.