Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27
1

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

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


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

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

З.Ы. я понимаю что мой подход в корне не верный и надо использовать объекты синхронизации, но почитав при них чё то ничё не нашёл ПОМОГИТЕ ПЛИИИЗ!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2009, 17:31
Ответы с готовыми решениями:

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

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

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

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

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
6
Администратор
79877 / 48440 / 244
Регистрация: 10.04.2006
Сообщений: 13,126
28.01.2009, 17:37 2
Цитата Сообщение от kess Посмотреть сообщение
примерно раз в 20 секунд программа пишет в базу один и тот же такт дважды. как решить данную проблему?
Потому что потоки у вас не синхронизированы.

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

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

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

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

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

я прочитал то что вы мне указали но не могу понять какая мне от этого польза в конкретном примере
у меня первый поток не останавливаясь считает время на 1 ядре процессора ,а второй просто должен запускаться раз в 10 милисекунд и писать информацию а бд при этом счёт времени ведёт 1 поток так как его вычисления ведуться в реальном времени
0
Администратор
79877 / 48440 / 244
Регистрация: 10.04.2006
Сообщений: 13,126
28.01.2009, 18:55 4
Выложите код метода второго потока.

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

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

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

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

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

Советую еще раз перечитать указанную статью. Там есть все, что вам нужно.
0
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 27
29.01.2009, 17:07  [ТС] 7
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2009, 17:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.