Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
1

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

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

Пишу простой RSS агрегатор и уже практически доделал его
в программе параллельно устанавливается соединение и потом извлекаем данные из файлов
когда я делал всё по отдельности(в одном проекте-запрос и запись в файл,в другом-чтение),то всё нормально
в данном случае файлы не создаются и у меня есть подозрение,что из-за многопоточности
я постарался код максимально закомментировать,чтоб было легче разобраться в нём
0
Вложения
Тип файла: rar Архив WinRAR.rar (1.32 Мб, 25 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2012, 20:47
Ответы с готовыми решениями:

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

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

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

Работа с потоками
Добрый вечер. Возникла такая проблема: в консольном приложении воспроизводится музыка при помощи ...

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

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

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

Добавлено через 7 минут
Ну да это общее
C++
1
2
static char errorBuffer[CURL_ERROR_SIZE];
static string buffer;
А должно быть для каждого потока своё.То есть возможно нужно снять с них static и впихнуть в нутрь ф-ции потока.
1
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
14.07.2012, 00:10  [ТС] 12
спасибо,а то из-за буфера для ошибки не хотел проект собираться
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2012, 00:10

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

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

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

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

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


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

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

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