Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для kess
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27

Многопоточность

28.01.2009, 17:31. Показов 3053. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая трудность:
2 потока, первый считает, а второй каждом 10мс такте пишет в базу данных то что посчитал первый.

делаю так:
C++
1
2
3
4
5
6
FirstThread::Execute
   {
       SecondThread->Resume();
       SecondThread->Suspend();
       Count (); //функция вычислений
   }
примерно раз в 20 секунд программа пишет в базу один и тот же такт дважды. как решить данную проблему?

З.Ы. я понимаю что мой подход в корне не верный и надо использовать объекты синхронизации, но почитав при них чё то ничё не нашёл ПОМОГИТЕ ПЛИИИЗ!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2009, 17:31
Ответы с готовыми решениями:

Многопоточность
Товарищи! Создаю 23 потока. вот так: ff1 = new f1(false); ff1->Priority = tpLower; Sleep(1000); после создания и старта...

Многопоточность
Добрый вечер. Назрела тут проблема с многопоточностью. Вкратце: Есть программа, которая считывает из файлика построчно циферки (точнее -...

Многопоточность
Здравсвуйте программисты! Дали лабораторную написать по многопоточности, никогда сталкивался с таким. Вот условие задания: ...

6
Администратор
 Аватар для mik-a-el
87856 / 53177 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
28.01.2009, 17:37
Цитата Сообщение от kess Посмотреть сообщение
примерно раз в 20 секунд программа пишет в базу один и тот же такт дважды. как решить данную проблему?
Потому что потоки у вас не синхронизированы.

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

Добавлено через 3 минуты 45 секунд
Цитата Сообщение от kess Посмотреть сообщение
я понимаю что мой подход в корне не верный и надо использовать объекты синхронизации
http://www.cyberguru.ru/progra... intro.html
0
 Аватар для kess
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27
28.01.2009, 18:22  [ТС]
Цитата Сообщение от mik-a-el Посмотреть сообщение
Потому что потоки у вас не синхронизированы.

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

Добавлено через 3 минуты 45 секунд

http://www.cyberguru.ru/progra... intro.html

я прочитал то что вы мне указали но не могу понять какая мне от этого польза в конкретном примере
у меня первый поток не останавливаясь считает время на 1 ядре процессора ,а второй просто должен запускаться раз в 10 милисекунд и писать информацию а бд при этом счёт времени ведёт 1 поток так как его вычисления ведуться в реальном времени
0
Администратор
 Аватар для mik-a-el
87856 / 53177 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
28.01.2009, 18:55
Выложите код метода второго потока.

Добавлено через 9 минут 53 секунды
Цитата Сообщение от kess Посмотреть сообщение
я прочитал то что вы мне указали но не могу понять какая мне от этого польза в конкретном примере
Вы хотели узнать о синхронизации потоков? Вот оно вам.
0
 Аватар для kess
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27
29.01.2009, 00:09  [ТС]
Цитата Сообщение от mik-a-el Посмотреть сообщение
Выложите код метода второго потока.

Добавлено через 9 минут 53 секунды

Вы хотели узнать о синхронизации потоков? Вот оно вам.
прошу прощения что долго не отвечал!
да не имеет значения просто для простоты можно потоково выкидывать номер такта в файл

моя задача научиться приостанавливать поток так что бы он жестко прописывал каждый такт при этом потоки работают на разных ядрах проца или на разных логических процах (Hyper Threading)
это делается потому что у меня тамер грузит один проц под максимум на 100 % и второму потоку не выделяется процессорного времени другой таймер использовать не могу не хватает точности счёта времени к тому же на первом проце крутиться ещё 17 математических функций по численному интегрированию и я просто не успеваю
0
Администратор
 Аватар для mik-a-el
87856 / 53177 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
29.01.2009, 10:35
Цитата Сообщение от kess Посмотреть сообщение
это делается потому что у меня тамер грузит один проц под максимум на 100 %
Многовато для таймера, не задумывались?
Цитата Сообщение от kess Посмотреть сообщение
и второму потоку не выделяется процессорного времени
Если второй поток заводится только по этой причине, то это бред.

В той реализации, что у вас, вы вновь запускаете второй поток и тут же, не беспокоясь о том, отработал он или нет, приостанавливаете его.

Советую еще раз перечитать указанную статью. Там есть все, что вам нужно.
0
 Аватар для kess
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27
29.01.2009, 17:07  [ТС]
Цитата Сообщение от mik-a-el Посмотреть сообщение
Многовато для таймера, не задумывались?

Тамер работает на QueryPerformanceCounter & Frequency поэтому загрузка ЦП 100%.

Если второй поток заводится только по этой причине, то это бред.

В той реализации, что у вас, вы вновь запускаете второй поток и тут же, не беспокоясь о том, отработал он или нет, приостанавливаете его.

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

А если по делу попробовал создавать событие CreateEvent:

C++
1
2
3
4
5
6
void __fastcall TTasks::CommonUpdate()
   {
      DWORD dw = WaitForSingleObject(hEvent,INFINITE);
      out<<Dispatcher->Secund<<"."<<Dispatcher->HunMillSec<<"."<<Dispatcher->TenMillSec<<'\n';
      ResetEvent(hEvent);
   }
это был поток записи, а второй (основной) поток должен работать не останавливаясь:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QueryPerformanceCounter(&ETIME);
         do
            {
               Synchronize(Dispatcher->Run);
               SetEvent(hEvent);
               do
                  {
                     QueryPerformanceCounter(&STIME);
                     DELTA=(STIME.QuadPart-ETIME.QuadPart)/FREQ;
                  }
               while (DELTA < 0.01);
 
               QueryPerformanceCounter(&ETIME);
            }
         while(!Terminated);
Я так понял что если поставить событие в сигнальное состояние (SetEvent) то поток записи может работать, а при ResetEvent() он ждёт пока состояние не станет опять сигнальным.

Но в такой реализации ResetEvent() устанавливает несигнальное состояние и всё т.е. SetEvent не срабатывает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2009, 17:07
Помогаю со студенческими работами здесь

C++ Многопоточность
Как сделать так, чтобы эта программа заработала? А то она мне вот что пишет: g++ test.cpp -o test -lpthread ./test ...

Многопоточность всокетах
Доброго дня! Есть кто сталкивался с многопоточностью в сокетах. Тоесть у меня есть приложение, на нем компонент TServerSocket....к нему...

CppWebBrowser и Многопоточность
Не смотря на то, что CppWebBrowser сам по себе как браузер создает потоки и работает с ними, когда создаеш на форме CppWebBrowser CWB =...

Многопоточность и IdHTTP
Всем доброго времени суток! Подскажите плз кто знает, по какой причине поток может перестать работать?(мб зависает) Засивает на...

THREAD.H (многопоточность)
нужно срочно разобраться в этой теме, но компилятор не находит THREAD.H #include &lt;thread&gt; #include &lt;iostream&gt; void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru