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

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

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

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

10.12.2012, 22:46. Просмотров 342. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2012, 22:46     Помощь с использованием потоков
Посмотрите здесь:

Максимальный элемент матрицы с использованием потоков - 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++
Подскажите как реализовать поиск объекта в бинарном файле.(телефонный справочник, поиск по названию абонента)

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

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

Ошибки потоков - C++
День добрый. Проблема с определением ошибки ввода потока #include&lt;iostream&gt; #include&lt;iomanip&gt; using namespace std; int main() {...

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

Удаление потоков - C++
Программа должна создавать несколько потоков, выводить о них информацию и корректно удалять либо 1 поток, либо все потоки при завершении...

Вектор потоков - C++
В программе мне требуется иметь доступ одновременно к большому количеству файлов ( чтение ). Чтение я осуществляю через ifstream. Сначала...

Перенаправление потоков - C++
Мне необходимо использовать в своей программе потом другой. Например: открыл я консоль, набрал команду, но результат слишком большой, я его...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.12.2012, 23:09     Помощь с использованием потоков #2
файлы открываются для перезаписи
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;
}

Жирным выделил кусок с подсчетом символов.
Yandex
Объявления
10.12.2012, 23:56     Помощь с использованием потоков
Ответ Создать тему
Опции темы

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