Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Trant
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 18
#1

Помощь с использованием потоков - C++

10.12.2012, 22:46. Просмотров 350. Ответов 2
Метки нет (Все метки)

Добрый вечер, вот пишу программу, которая создает 2 потока, первый считает в файле кол-во символов и записывает в файл, второй считает кол-во пробелов и также записывает в файл. Вроде бы программа работает, но в файл больше одной строки не пишет, даже при включении несколько раз. Если кто может подскажите где ошибка, что исправить.
Код:
Кликните здесь для просмотра всего текста

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
#include <windows.h>
#include <string>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <ctype.h>
 
using namespace std;
 
HANDLE hMutex = CreateMutex(NULL, false, NULL);
 
DWORD ThreadFunc(LPVOID lpvThreadParam)
{
    int count1=0,count2=0;
    ifstream fileIn("C:\\in.txt");
    if(int(lpvThreadParam)==1)
    {
        while(!fileIn.eof())
        {
          char ch;
          fileIn.get(ch);
          if(ch!=' '&&ch!=EOF&&ch!='\n')
              count1++;
        }
        fileIn.close();
        WaitForSingleObject(hMutex, INFINITE);
        ofstream fileOut("C:\\out.txt");
        fileOut << "Символов в тексте " << count1 << ". Выполнялся поток №" << int(lpvThreadParam) << endl;
        fileOut.close();
        ReleaseMutex(hMutex);
    }
    if(int(lpvThreadParam)==2)
    {
        while(!fileIn.eof())
        {
          char ch;
          fileIn.get(ch);
          if(ch==' ')
              count2++;
        }
        fileIn.close();
        WaitForSingleObject(hMutex, INFINITE);
        ofstream fileOut("C:\\out.txt");
        fileOut << "Пробелов в тексте " << count2 << ". Выполнялся поток №" << int(lpvThreadParam) << endl;
        fileOut.close();
        ReleaseMutex(hMutex);
    }
    
    ExitThread(0);
}
 
 
int main()
{
    int Id = 1;
 
    DWORD lpThreadId[2];
    HANDLE hThreadId[2];
 
    hThreadId[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, (LPVOID)Id++, 0, &lpThreadId[0]);
    hThreadId[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, (LPVOID)Id++, 0, &lpThreadId[1]);
    WaitForMultipleObjects(2, hThreadId, TRUE, INFINITE);
 
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2012, 22:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Помощь с использованием потоков (C++):

Максимальный элемент матрицы с использованием потоков - C++
#include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int *Mas; struct...

Многопоточный чат с использованием пула потоков - C++
есть вопрос как реализовать можно чат с использованием пулов потоков.Без пула все понятно на каждого клиента создается поток и потоки висят...

Поиск в бинарном файле с использованием файловых потоков - C++
Подскажите как реализовать поиск объекта в бинарном файле.(телефонный справочник, поиск по названию абонента)

Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи - C++
Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: • конструктор, • деструктор, ...

Создание и завершение процессов и потоков. Приоритеты выполнения потоков - C++
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

Выполнить задания с использованием инструкции выбора if и с использованием условного оператора - C++
Выполнить задания с использованием инструкции выбора if и с использованием условного оператора ? (если он присутствует в языке...

2
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.12.2012, 23:09 #2
файлы открываются для перезаписи
0
Trant
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 18
10.12.2012, 23:56  [ТС] #3
Благодарю, поправил, все работает, правда зажовывает в конце символ, если в условии подсчета символов есть ch!=EOF, если условие убрать, то наоборот кол-во символов становится нормальным плюс еще считается конец файла.
Вот новый код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <windows.h>
#include <string>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <ctype.h>
 
using namespace std;
 
HANDLE hMutex = CreateMutex(NULL, false, NULL);
 
DWORD ThreadFunc(LPVOID lpvThreadParam)
{
    int count1=0,count2=0;
    FILE *fin,*fout;
    fin=fopen("C:\\in.txt","r");
if(int(lpvThreadParam)==1)
{
while(!feof(fin))
{
char ch;
ch=getc(fin);
if(ch!=' '&&ch!=EOF&&ch!='\n')
count1++;
}
fclose(fin);
WaitForSingleObject(hMutex, INFINITE);
fout=fopen("C:\\out.txt","a+");
fprintf(fout,"Символов в тексте %d. Выполнялся поток №%d\n",count1,int(lpvThreadParam));
fclose(fout);
ReleaseMutex(hMutex);
}

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
    if(int(lpvThreadParam)==2)
    {
        while(!feof(fin))
        {
          char ch;
          ch=getc(fin);
          if(ch==' ')
              count2++;
        }
        fclose(fin);
        WaitForSingleObject(hMutex, INFINITE);
        fout=fopen("C:\\out.txt","a+");
        fprintf(fout,"Пробелов в тексте %d. Выполнялся поток №%d\n",count2,int(lpvThreadParam));
        fclose(fout);
        ReleaseMutex(hMutex);
    }
    
    ExitThread(0);
}
 
 
int main()
{
    int Id = 1;
 
    DWORD lpThreadId[2];
    HANDLE hThreadId[2];
 
    hThreadId[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, (LPVOID)Id++, 0, &lpThreadId[0]);
    hThreadId[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, (LPVOID)Id++, 0, &lpThreadId[1]);
    WaitForMultipleObjects(2, hThreadId, TRUE, INFINITE);
 
 
    return 0;
}

Жирным выделил кусок с подсчетом символов.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 23:56
Привет! Вот еще темы с ответами:

Написать программу с использованием функции и с использованием макроса - C++
Составить две программы вычисления функции F и сравнить результаты ***** - Используя объявления макроса; ***** - Используя обращение к...

Подмена потоков - C++
freopen(&quot;мой_файл.txt&quot;, &quot;w&quot;, stdout) Как заменить мой_файл.txt на stdout? В Си

выбор потоков - C++
Здравствуйте форумчане! Суть проблемы такова, ниже дана программа для сортировки и надо чтобы пользователь сам мог выбирать во сколько...

Синхронизация потоков в c++ - C++
Совершенно не понятно что не так и как правильно. Задача: Отсортировать массив целых чисел. Программу разбить на два синхронизированных...


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

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

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