Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.184.237] |
|
Сообщ.
#1
,
|
|
|
1 Создаю структуру для поиска (WIN32_FIND_DATA) в разделяемой памяти.
2 Запускаю несколько процессов, ищущих (FindNextFileA) через неё. 3 Второе приложение, которое не в отладке, с сообщением останавливается при первом же вызове FindNextFileA, даже до следующего GetLastError не доходит. Из сообщениея "project.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства" никакой вывод сделать не удалось. Можно как-то выяснить причину остановки другого экземпляра процесса, который не отладке. Вообще можно поиск файлов вести из нескольких процессов в Windows XP 64? |
Сообщ.
#2
,
|
|
|
Цитата FateFlex @ 1 Создаю структуру для поиска (WIN32_FIND_DATA) в разделяемой памяти. Ну, так, видимо, в этом и проблема. Падает на совместном доступе к структуре. |
Сообщ.
#3
,
|
|
|
Цитата FateFlex @ 1 Создаю структуру для поиска (WIN32_FIND_DATA) в разделяемой памяти. 2 Запускаю несколько процессов, ищущих (FindNextFileA) через неё. В чем смысл использования одной общей структуры несколькими процессами\потоками?! Если бы это был массив структур (хотя бы по одной на каждый процесс\поток, или логичнее - на каждый найденный файл), тогда - понятно. |
Сообщ.
#4
,
|
|
|
Похоже что нельзя поиск из нескольких процессов через одну WIN32_FIND_DATA вести, эта структура содержит не все данные поиска (например самой маски поиска в ней нет), поэтому вызов FindNextFileA из другого процесса выглядит так, как будто до него не вызывался FindFirstFileA (который инициализирует поиск/библиотеку).
|
Сообщ.
#5
,
|
|
|
Цитата FateFlex @ эта структура содержит не все данные поиска (например самой маски поиска в ней нет), поэтому вызов FindNextFileA из другого процесса выглядит так, как будто до него не вызывался FindFirstFileA (который инициализирует поиск/библиотеку). Разумеется, т.к. параметры поиска содержатся в хэндле hFindFile, возвращаемом функцией FindFirstFile. PS: Если ты собрался в разных процессах искать одни и те же файлы (в одной директории с одной маской), то это вообще не имеет смысла, т.к. FindFirstFile и FindNextFile это лишь обертки над супер-пупер нативной функцией Zw\NtQueryDirectoryFile, которая при первом вызове находит не один файл, а массив файлов (FileInformation) достаточно большого размера\длины (Length). Поэтому львиная доля времени уходит именно на вызов FindFirstFile для реального поиска файлов и заполнение буфера (а также на FindNextFile на Length+1 шаге, когда нужно загрузить новый буфер). А промежуточные вызовы FindNextFile в пределах текущего буфера найденных файлов выполняются очень быстро, поэтому разделять их на разные потоки, и тем более процессы, не имеет никакого смысла. |