Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632

Работа с потоками

12.07.2012, 20:47. Показов 1439. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу простой RSS агрегатор и уже практически доделал его
в программе параллельно устанавливается соединение и потом извлекаем данные из файлов
когда я делал всё по отдельности(в одном проекте-запрос и запись в файл,в другом-чтение),то всё нормально
в данном случае файлы не создаются и у меня есть подозрение,что из-за многопоточности
я постарался код максимально закомментировать,чтоб было легче разобраться в нём
Вложения
Тип файла: rar Архив WinRAR.rar (1.32 Мб, 25 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2012, 20:47
Ответы с готовыми решениями:

Работа с потоками
Задание Разработать программу, реализующую многопочность средствами среды Win32. Программа должна обеспечивать: Отображение списка...

Работа с потоками.
Здравствуйте. Есть программа реализующая перебор вариантов размена суммы (к примеру 100 = 100, 100 = 50 + 50 т.д.) #include...

Работа с потоками
Поток main должен выполнить следующие действия: создать массив, размерность и элементы которого вводятся пользователем с консоли; ...

11
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 01:46  [ТС]
хочу заметить,что если делаю программу однопоточной,то всё работает,файл создаётся,из него можно считать всё,что нужно
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 09:47
Цитата Сообщение от alexey31415 Посмотреть сообщение
хочу заметить,что если делаю программу однопоточной,то всё работает,файл создаётся,из него можно считать всё,что нужно
Если несколько потоков, а их три, обращаются к одному объекту на изменение данных (в parsing.cpp), то неизбежно будет возникать ошибка.
Используй в начале функции void parsing(PVOID pvoid) функцию WaitForSingleObject( hObjectMutex, INFINITE ); и в конце ReleaseMutex( hObjectMutex);
1
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 14:46  [ТС]
Цитата Сообщение от Nukutu Посмотреть сообщение
обращаются к одному объекту на изменение данных (в parsing.cpp), то неизбежно будет возникать ошибка.
я знаю про это,но ведь они обращаются к разным файлам,ни одна функция не разделяет переменных
да и к тому же файлы не создаются,значит проблема возникает ещё в функции connect

Добавлено через 3 часа 5 минут
Цитата Сообщение от Nukutu Посмотреть сообщение
Используй в начале функции void parsing(PVOID pvoid) функцию WaitForSingleObject( hObjectMutex, INFINITE ); и в конце ReleaseMutex( hObjectMutex);
попробовал и помогло,спасибо вам,но я так и не понял,какие данные разделялись между потоками
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 15:13
Цитата Сообщение от alexey31415 Посмотреть сообщение
попробовал и помогло,спасибо вам,но я так и не понял,какие данные разделялись между потоками
NEWS source[15]; - это один объект для всех потоков.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 17:12  [ТС]
я добавил мьютексы пока лишь в функцию connect,файлы создаются,однако сохраняются не так,как надо.То есть,в файле apple_rss.xml вдруг новсти с kp.ua,то есть перемешалось всё
оказывается он использует один и тот же буфер и всё туда записывает,то есть с первым файлом всё нормально,а вот в случае со вторым и третьим беда-в них записыается содержимое предыдущих файлов
вот на всякий случай код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "StdAfx.h"
 
//-----------------------------------------------------------------------
//функция для установления соединения,получения данных и записи их в файл
//-----------------------------------------------------------------------
 
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объявляем буфер принимаемых данных
static string buffer;
 
HANDLE hMutex;
 
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
  //переменная - результат, по умолчанию нулевая
  int result = 0;
 
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    buffer->append(data, size * nmemb);
    //вычисляем объем принятых данных
    result = size * nmemb;
  }
  //вовзращаем результат
  return result;
}
 
 
 
void connect(PVOID pvoid)
{
    PINFO pinfo = (PINFO)pvoid;
 
setlocale(0,"");
 
    hMutex = CreateMutex(NULL,true,"Mutex");
 
    WaitForSingleObject(hMutex,INFINITE);
 
 
  //необходимые CURL объекты
  CURL *curl;
  CURLcode result;
  //инициализируем curl
  curl = curl_easy_init();
 
  //проверяем результат инициализации
  if (curl)
    {
 
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      //задаем все необходимые опции
      curl_easy_setopt(curl, CURLOPT_URL,pinfo->url);
     
      curl_easy_setopt(curl, CURLOPT_HEADER, 0);         // не возвращает заголовки
      curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
      curl_easy_setopt(curl, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
 
      curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
      curl_easy_setopt(curl, CURLOPT_TIMEOUT, 120);        // таймаут ответа
      curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа
 
 
      //указываем функцию обратного вызова для записи получаемых данных
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      //указываем куда записывать принимаемые данные
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
      //запускаем выполнение задачи
      result = curl_easy_perform(curl);
 
      //проверяем успешность выполнения операции
      if (result == CURLE_OK)
        {
        string fn(pinfo->NameOfFile);
        ofstream f(fn.c_str());
        if(!f) { MessageBox(pinfo->hwnd, "Can't create file","Error",MB_OK);}
        else   { f<<buffer<<endl; f.close();}
        }
  }
    else
    //выводим сообщение об ошибке
    MessageBox(pinfo->hwnd, "Can't connect","Error",MB_OK);
     
  //завершаем сессию
  curl_easy_cleanup(curl);
 
  ReleaseMutex(hMutex);
 
  _endthread();
 
 
}
Добавлено через 1 час 40 минут
Я исправил предыдущую ошибку,теперь борюсь с двумя:первая-разделение потоков,мне нужно,чтобы сначала завершились потоки для загрузки данных,а лишь потом запустились потоки для открытия файлов
я использовал объект Event,однако возникла проблема,что один файл не открывается,то есть два уже есть,они открываются,а один какой-нибудь-нет
Проблема №2:не выводятся строки в списках,хотя в структуре NEWS они есть
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 19:24
Цитата Сообщение от alexey31415 Посмотреть сообщение
первая-разделение потоков,мне нужно,чтобы сначала завершились потоки для загрузки данных,а лишь потом запустились потоки для открытия файлов
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
Цитата Сообщение от alexey31415 Посмотреть сообщение
Проблема №2:не выводятся строки в списках,хотя в структуре NEWS они есть
В какой части кода не выводятся? (чтобы не искать)
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 19:42  [ТС]
в файле WndProc.cpp вывод данных в список
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
а как именно использовать?
Вложения
Тип файла: rar Архив WinRAR.rar (1.33 Мб, 6 просмотров)
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 20:12
Цитата Сообщение от alexey31415 Посмотреть сообщение
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
а как именно использовать?
Вот ссылка как раз для твоего случая http://msdn.microsoft.com/en-u... s.85).aspx

Добавлено через 15 минут
Цитата Сообщение от alexey31415 Посмотреть сообщение
в файле WndProc.cpp вывод данных в список
Вместо простого массива лучше использовать вектор или лист, тогда можно проверить их size(), есть ли записи. Также надо проверять title и link на NULL, и в конце проверяй, что возвращает SendMessage. Скорее всего она возвращает ошибку.
1
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 20:30  [ТС]
в цикле,где парсится файл я проверяю данные,они есть,вот почему их в списках нет,я не пойму,хотя надо действителньо проверить,чт возвращает SendMessage

Добавлено через 6 минут
Цитата Сообщение от Nukutu Посмотреть сообщение
Используй WaitForMultipleObjects
можно ли использовать эту функцию не создавая потоки при помощи CreateThread,а то у меня уже не работает код
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2012, 00:08
Проще с критическими секциями
Объекты синхронизации

Добавлено через 7 минут
Ну да это общее
C++
1
2
static char errorBuffer[CURL_ERROR_SIZE];
static string buffer;
А должно быть для каждого потока своё.То есть возможно нужно снять с них static и впихнуть в нутрь ф-ции потока.
1
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
14.07.2012, 00:10  [ТС]
спасибо,а то из-за буфера для ошибки не хотел проект собираться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2012, 00:10
Помогаю со студенческими работами здесь

Работа с потоками
Добрый вечер. Возникла такая проблема: в консольном приложении воспроизводится музыка при помощи mciSendString(s.c_str(), NULL, 0,...

Работа с потоками
У меня есть меню в игре. И я хотел бы, чтобы при переключении пунктов меню воспроизводился звук. Потоки мне нужны, чтобы одновременно был и...

Работа с потоками
Задача поставлена так : Необходимо открыть поток, записать некую информацию и далее закрыть его. Но необходимо, чтобы после закрытия...

Работа с потоками
Нужно посчитать сумму элементов в матрице nxn написал а она мне выдаёт ошибку. и теперь не знаю что надо делать. ...

работа с потоками
Добрый вечер! Есть файл txt, состоит из символов, чисел, необходимо его открыть, упорядочить некоторым образом и записать, начал с...


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

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

Новые блоги и статьи
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru