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

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

Восстановить пароль Регистрация
 
Trant
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 18
10.12.2012, 22:46     Помощь с использованием потоков #1
Добрый вечер, вот пишу программу, которая создает 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++
Программирование с использованием строк (обычный вариант и с использованием 3 видов строк) C++
C++ Выполнить задания с использованием инструкции выбора if и с использованием условного оператора
Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи C++
C++ Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Многопоточный чат с использованием пула потоков C++
Поиск в бинарном файле с использованием файловых потоков C++
Написать программу с использованием функции и с использованием макроса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для 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     Помощь с использованием потоков
Ответ Создать тему
Опции темы

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