Форум программистов, компьютерный форум CyberForum.ru

Работа с потоками - C++

Восстановить пароль Регистрация
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
12.07.2012, 20:47     Работа с потоками #1
Пишу простой RSS агрегатор и уже практически доделал его
в программе параллельно устанавливается соединение и потом извлекаем данные из файлов
когда я делал всё по отдельности(в одном проекте-запрос и запись в файл,в другом-чтение),то всё нормально
в данном случае файлы не создаются и у меня есть подозрение,что из-за многопоточности
я постарался код максимально закомментировать,чтоб было легче разобраться в нём
Вложения
Тип файла: rar Архив WinRAR.rar (1.32 Мб, 23 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 20:47     Работа с потоками
Посмотрите здесь:

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

Добавлено через 3 часа 5 минут
Цитата Сообщение от Nukutu Посмотреть сообщение
Используй в начале функции void parsing(PVOID pvoid) функцию WaitForSingleObject( hObjectMutex, INFINITE ); и в конце ReleaseMutex( hObjectMutex);
попробовал и помогло,спасибо вам,но я так и не понял,какие данные разделялись между потоками
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 15:13     Работа с потоками #5
Цитата Сообщение от alexey31415 Посмотреть сообщение
попробовал и помогло,спасибо вам,но я так и не понял,какие данные разделялись между потоками
NEWS source[15]; - это один объект для всех потоков.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 17:12  [ТС]     Работа с потоками #6
я добавил мьютексы пока лишь в функцию 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 они есть
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 19:24     Работа с потоками #7
Цитата Сообщение от alexey31415 Посмотреть сообщение
первая-разделение потоков,мне нужно,чтобы сначала завершились потоки для загрузки данных,а лишь потом запустились потоки для открытия файлов
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
Цитата Сообщение от alexey31415 Посмотреть сообщение
Проблема №2:не выводятся строки в списках,хотя в структуре NEWS они есть
В какой части кода не выводятся? (чтобы не искать)
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
13.07.2012, 19:42  [ТС]     Работа с потоками #8
в файле WndProc.cpp вывод данных в список
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
а как именно использовать?
Вложения
Тип файла: rar Архив WinRAR.rar (1.33 Мб, 5 просмотров)
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
13.07.2012, 20:12     Работа с потоками #9
Цитата Сообщение от alexey31415 Посмотреть сообщение
Используй WaitForMultipleObjects для ожидания завершения первых всех потоков.
а как именно использовать?
Вот ссылка как раз для твоего случая http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

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

Добавлено через 6 минут
Цитата Сообщение от Nukutu Посмотреть сообщение
Используй WaitForMultipleObjects
можно ли использовать эту функцию не создавая потоки при помощи CreateThread,а то у меня уже не работает код
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
14.07.2012, 00:08     Работа с потоками #11
Проще с критическими секциями
Объекты синхронизации

Добавлено через 7 минут
Ну да это общее
C++
1
2
static char errorBuffer[CURL_ERROR_SIZE];
static string buffer;
А должно быть для каждого потока своё.То есть возможно нужно снять с них static и впихнуть в нутрь ф-ции потока.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 00:10     Работа с потоками
Еще ссылки по теме:

Работа с файлами и потоками C++
Работа с потоками C++
C++ Работа с потоками

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

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
14.07.2012, 00:10  [ТС]     Работа с потоками #12
спасибо,а то из-за буфера для ошибки не хотел проект собираться
Yandex
Объявления
14.07.2012, 00:10     Работа с потоками
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru