Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.70.131] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Сделай malloc(strlen(...) + 1) |
Сообщ.
#17
,
|
|
|
Цитата Олег М @ Сделай malloc(strlen(...) + 1) Сделал так: unsigned __stdcall SearchFiles2(void* lpszFile) { char *lpszFileName = (char*)malloc(2048 * sizeof(char)); strcpy(lpszFileName, (char *)lpszFile); char *path = (char*)malloc(strlen(lpszFileName) * sizeof(char) + 255); char *temp = (char*)malloc(strlen(lpszFileName) * sizeof(char) + 255); strcpy(path, lpszFileName); strcat(path, "*.*"); /*...........................................*/ FindClose(hand); free(lpszFileName); free(path); free(temp); return 0; } Всё остальное без изменения. Прогнал весь системный диск(примерно 310т. файлов) 3 раза тем же методом. Ошибка не появилась. Спасибо за совет) |
Сообщ.
#18
,
|
|
|
В общем,основной поток не ждёт завершения "дочерних" потоков.
WaitForMultipleObjects(drive, hThreads, TRUE, INFINITE); WaitForMultipleObjects(find_file, hFileThreads, TRUE, INFINITE); for(int i = 0; i < find_file; i++) CloseHandle(hFileThreads[i]); for(int i = 0; i < drive; i++) CloseHandle(hThreads[i]); использую это в основном потоке,где hThreads - потоки функции поиска файлов и записи их нахождения в char *file;(сколько дисков,столько и потоков,но пока проверяю на 1 диске) hFileThreads - потоки функции вывода вывода char *file в консоль.(стоит 100) На диске около 200 txt файлов. Поиск происходит в 3 цикла с перерывом 5 сек. Заметил,что в каждом цикле на разных файлах заканчивается вывод. Иногда попадает на последний на диске(выводит согласно алфавиту),но часто не доходит до него. |
Сообщ.
#19
,
|
|
|
Цитата Sherman @ Пишу многопоточную программу для поиска файлов. Для создания потоков использую _beginthreadex. ... Подскажите,пожалуйста,в чём ошибка? Компилирую из консоли gcc main.c -o char -static -s -Wall -Wextra -Werror -W Можно почитать известную книгу Рихтера, глава 6. (стр 130) _beginthreadex - эта функция не является функцией Виндус. Это некая обёртка вокруг "CreateThread" для ликвидации неких внутренних проблем потоко-безопасных библиотек Микрософта ! А будет ли полезно и чем закончится её применение для библиотек других производителей других компиляторов вообще не известно. |
Сообщ.
#20
,
|
|
|
Цитата ЫукпШ @ _beginthreadex - эта функция не является функцией Виндус. Это некая обёртка вокруг "CreateThread" для ликвидации неких внутренних проблем потоко-безопасных библиотек Микрософта ! Но на том же сайте упамянутого Майкрософта написано,мол "Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для управления потоками..." Или это не мой случай? |
Сообщ.
#21
,
|
|
|
Цитата Sherman @ На диске около 200 txt файлов. Поиск происходит в 3 цикла с перерывом 5 сек. Заметил,что в каждом цикле на разных файлах заканчивается вывод. Иногда попадает на последний на диске(выводит согласно алфавиту),но часто не доходит до него. Здесь у тебя вроде всё правильно, ошибка где-то в другом месте. А вообще - это очень хреновая идея делать по потоку на файл. Обычно такие задачи решаются при помощи пула потоков. Добавлено Цитата Sherman @ Но на том же сайте упамянутого Майкрософта написано,мол "Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для управления потоками..." Или это не мой случай? Твой. Только _endthreadex не нужно вызывать, он сам вызовется. |
Сообщ.
#22
,
|
|
|
Цитата Олег М @ Обычно такие задачи решаются при помощи пула потоков. Есть какая-нибудь ссылка на пример или что-нибудь,где подсмотреть,как это делается? |
Сообщ.
#23
,
|
|
|
Цитата Sherman @ Есть какая-нибудь ссылка на пример или что-нибудь,где подсмотреть,как это делается? У меня нет, я не занимался такими задачами. Думаю здесь оптимальным будет создать 3 потока: 1-й Ищет файлы, складывает их имена в очередь 2-й Берёт из очереди имя файла, начитывает его небольшими, ~4К, блоками и складывает их в другую очередь (желательно с контролем размера, т.к. чтение быстрее записи) 3-й Берёт блоки из очереди и сохраняет их в соответствующие файлы И, лучше решать эту задачу на с++. Зачем тебе именно Си? |
Сообщ.
#24
,
|
|
|
Цитата Олег М @ Зачем тебе именно Си? Так уж пал мой взгляд на изучение программирования на Си.Вот и пытаюсь реализовать задумку на этом языке. Цитата Олег М @ Ищет файлы, складывает их имена в очередь char **files = (char**)malloc(3e+7 * sizeof(char)); Это подойдёт для очереди? Если да,то как определить размер (3e+7 * sizeof(char)) ,если я не знаю,сколько я получу строк? |
Сообщ.
#25
,
|
|
|
Цитата Sherman @ Это подойдёт для очереди? Нет не подойдёт. Здесь подойдёт только FIFO-стек, который реализуется либо как список, либо как циклический массив. Цитата Sherman @ Так уж пал мой взгляд на изучение программирования на Си.Вот и пытаюсь реализовать задумку на этом языке. Ну, с одной стороны полезно, для общего развития. Хотя смысла мало, а упустишь в современном программировании много. |
Сообщ.
#26
,
|
|
|
Цитата Олег М @ Ну, с одной стороны полезно, для общего развития. Хотя смысла мало, а упустишь в современном программировании много. Возможно,но пока это на уровне любимого хобби. Цитата Олег М @ Здесь подойдёт только FIFO-стек О,новые слова..... Буду искать)) |
Сообщ.
#27
,
|
|
|
Цитата Sherman @ Возможно,но пока это на уровне любимого хобби. Я бы не стал тратить время, ты мало чему научишься. Лучше всё делать на с++. Цитата Sherman @ О,новые слова..... Буду искать)) Если хочешь научиться базовым алгоритмам (по-моему, у тебя именно с ними проблема), просто не используй стандартную библиотеку, реализуй все эти списки-массивы сам. |
Сообщ.
#28
,
|
|
|
Цитата Олег М @ реализуй все эти списки-массивы сам Спасибо за совет,попробую. |