На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Не работает функция в потоке _beginthreadex , Не работает функция в потоке _beginthreadex
    Цитата Sherman @
    как грамотно сделать проверку,strlen()?

    Сделай malloc(strlen(...) + 1)
      Цитата Олег М @
      Сделай malloc(strlen(...) + 1)

      Сделал так:
      ExpandedWrap disabled
        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 раза тем же методом.
      Ошибка не появилась.
      Спасибо за совет)
      Сообщение отредактировано: Sherman -
        В общем,основной поток не ждёт завершения "дочерних" потоков.
        ExpandedWrap disabled
              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 сек.
        Заметил,что в каждом цикле на разных файлах заканчивается вывод.
        Иногда попадает на последний на диске(выводит согласно алфавиту),но часто не доходит до него.
          Цитата Sherman @
          Пишу многопоточную программу для поиска файлов.
          Для создания потоков использую _beginthreadex.
          ...
          Подскажите,пожалуйста,в чём ошибка?
          Компилирую из консоли gcc main.c -o char -static -s -Wall -Wextra -Werror -W

          Можно почитать известную книгу Рихтера, глава 6. (стр 130)
          _beginthreadex - эта функция не является функцией Виндус.
          Это некая обёртка вокруг "CreateThread" для ликвидации неких
          внутренних проблем потоко-безопасных библиотек Микрософта !
          А будет ли полезно и чем закончится её применение для библиотек
          других производителей других компиляторов вообще не известно.
          Сообщение отредактировано: ЫукпШ -
            Цитата ЫукпШ @
            _beginthreadex - эта функция не является функцией Виндус.
            Это некая обёртка вокруг "CreateThread" для ликвидации неких
            внутренних проблем потоко-безопасных библиотек Микрософта !

            Но на том же сайте упамянутого Майкрософта написано,мол
            "Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для управления потоками..."
            Или это не мой случай?
              Цитата Sherman @
              На диске около 200 txt файлов.
              Поиск происходит в 3 цикла с перерывом 5 сек.
              Заметил,что в каждом цикле на разных файлах заканчивается вывод.
              Иногда попадает на последний на диске(выводит согласно алфавиту),но часто не доходит до него.


              Здесь у тебя вроде всё правильно, ошибка где-то в другом месте.

              А вообще - это очень хреновая идея делать по потоку на файл. Обычно такие задачи решаются при помощи пула потоков.

              Добавлено
              Цитата Sherman @
              Но на том же сайте упамянутого Майкрософта написано,мол
              "Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для управления потоками..."
              Или это не мой случай?


              Твой. Только _endthreadex не нужно вызывать, он сам вызовется.
                Цитата Олег М @
                Обычно такие задачи решаются при помощи пула потоков.

                Есть какая-нибудь ссылка на пример или что-нибудь,где подсмотреть,как это делается?
                  Цитата Sherman @
                  Есть какая-нибудь ссылка на пример или что-нибудь,где подсмотреть,как это делается?

                  У меня нет, я не занимался такими задачами.

                  Думаю здесь оптимальным будет создать 3 потока:
                  1-й Ищет файлы, складывает их имена в очередь
                  2-й Берёт из очереди имя файла, начитывает его небольшими, ~4К, блоками и складывает их в другую очередь (желательно с контролем размера, т.к. чтение быстрее записи)
                  3-й Берёт блоки из очереди и сохраняет их в соответствующие файлы

                  И, лучше решать эту задачу на с++. Зачем тебе именно Си?
                    Цитата Олег М @
                    Зачем тебе именно Си?

                    Так уж пал мой взгляд на изучение программирования на Си.Вот и пытаюсь реализовать задумку на этом языке.
                    Цитата Олег М @
                    Ищет файлы, складывает их имена в очередь

                    char **files = (char**)malloc(3e+7 * sizeof(char));
                    Это подойдёт для очереди?
                    Если да,то как определить размер (3e+7 * sizeof(char)) ,если я не знаю,сколько я получу строк?
                      Цитата Sherman @
                      Это подойдёт для очереди?

                      Нет не подойдёт. Здесь подойдёт только FIFO-стек, который реализуется либо как список, либо как циклический массив.

                      Цитата Sherman @
                      Так уж пал мой взгляд на изучение программирования на Си.Вот и пытаюсь реализовать задумку на этом языке.

                      Ну, с одной стороны полезно, для общего развития. Хотя смысла мало, а упустишь в современном программировании много.
                        Цитата Олег М @
                        Ну, с одной стороны полезно, для общего развития. Хотя смысла мало, а упустишь в современном программировании много.

                        Возможно,но пока это на уровне любимого хобби.

                        Цитата Олег М @
                        Здесь подойдёт только FIFO-стек

                        О,новые слова.....
                        Буду искать))
                          Цитата Sherman @
                          Возможно,но пока это на уровне любимого хобби.

                          Я бы не стал тратить время, ты мало чему научишься. Лучше всё делать на с++.

                          Цитата Sherman @
                          О,новые слова.....
                          Буду искать))


                          Если хочешь научиться базовым алгоритмам (по-моему, у тебя именно с ними проблема), просто не используй стандартную библиотеку, реализуй все эти списки-массивы сам.
                            Цитата Олег М @
                            реализуй все эти списки-массивы сам

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


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0492 ]   [ 16 queries used ]   [ Generated: 19.03.24, 06:10 GMT ]