Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 10.12.2012
Сообщений: 18
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер, вот пишу программу, которая создает 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2012, 22:46
Ответы с готовыми решениями:

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

Обработка матриц с использованием файлов и потоков
Задание такое: Создать класс matrica с заранее неизвестным количеством элементов. Предусмотреть...

Максимальный элемент матрицы с использованием потоков
#include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using...

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

2
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.12.2012, 23:09 2
файлы открываются для перезаписи
0
0 / 0 / 1
Регистрация: 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
10.12.2012, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2012, 23:56
Помогаю со студенческими работами здесь

вычисление числа пи с использованием потоков
Добрый вечер,подскажите пожалуйста, начал изучать изучение многопоточности микроядерных ОС...

Запись в файл с использованием потоков
Нужно написать программу, создающую пять потоков. Каждый из них через случайные промежутки времени...

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

Программа подсчёта счастливых билетов (с использованием потоков)
Составить программу, которая считает количество счастливых билетов в трамвайном рулоне и выводит их...

Выполнить заполнение массива с использованием нескольких потоков
Требуется выполнить заполнение массива с использованием нескольких потоков. Соответственно есть...

Избегать столкновений двух кругов, движущихся с использованием разных потоков
Есть код который создает два (потока) круга, и они движутся с разной скоростью. Необходимо...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru