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

Обработка строки из файла в порожденном процессе(потоке) - C++

Восстановить пароль Регистрация
 
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
16.12.2012, 14:02     Обработка строки из файла в порожденном процессе(потоке) #1
Доброго времени суток.
Помогите, пожалуйста, разобраться с чего начать.
Задание звучит так: "Поиск указанной строки в указанном файле. Обработка одной строки в порожденном процессе (потоке)."
С поиском строки в файле, я уже как нибудь сам разберусь, а вот как это запихнуть в процесс (поток)?
Заранее спасибо за ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 14:02     Обработка строки из файла в порожденном процессе(потоке)
Посмотрите здесь:

Обработка строки из файла!?? C++
Обработка файла C++
C++ ИНИ-файл. Обработка файла. Строки. (Только для умелых)
C++ Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
C++ Получить третий файл, содержащий чётные строки первого файла и нечётные строки второго файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.12.2012, 14:07     Обработка строки из файла в порожденном процессе(потоке) #2
footbaler, порождаете поток std::thread.
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
16.12.2012, 14:15  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #3
go, спасибо, но если бы примерный код увидеть, я бы начал понимать, что к чему.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.12.2012, 14:43     Обработка строки из файла в порожденном процессе(потоке) #4
footbaler, напишите свой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Worker 
{
public:
    Worker(const std::string line_, const std::string path_) 
        : line(line_), path(path_)
    {
 
    }
    void operator()(); // Здесь будете обрабатывать
private:
    const std::string path;
    const std::string line;
};
 
 
str::thread t(Worker(line, path));
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
17.01.2013, 20:49  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #5
Вот, что пока получается... Способ поиска строки в файле нашел на этом форуме, а вот все это в поток засунуть получается методом тыка, как это показывал преподаватель, но он то, в отличие от меня, понимает, что написал, я же только подставил свой код в его.
КОД
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 <iostream>
#include <fstream>
#include <string>
#include <windows>
#include <conio>
using namespace std;
 
DWORD WINAPI thread_pr()
{
    string text = "", search, result;
    fstream file;
    cout << "Введите слово, для поиска: ";
    cin  >> search;
    cout << "-------------------------------------" << endl;
    file.open("file.txt", fstream::in | fstream::out);
    if(file)
    {
    while(!file.eof())
    text += file.get();
    file.close();
    }
    int find_pos = text.find(search);
    if(find_pos == -1)
    {
        cout << "Такого слова нет!!!" << endl << endl;
        getch();
        return 0;
    }
    for(int i = find_pos; ; i--)
    {
        if( text[i] != '!' && text[i] != '.' &&
            text[i] != '?' && i != 0)
            find_pos--;
        else
        {
            find_pos = i;
            if(find_pos > 0) find_pos++;
            break;
        }
    }
    for(int i = find_pos; ; i++)
    {
        if( text[i] != '!' && text[i] != '.' && text[i] != '?' &&
            (int)text[i] != -1)
        {
            if(i == find_pos && text[i] == ' ') continue;
            result += text[i];
        }
        else break;
    }
    cout << result << endl << endl;
    getch();
    return 0;
}
 
int main ()
{
    HANDLE thread;
   thread=(HANDLE)CreateThread(NULL, 0, thread_pr, 0, 0, NULL);
   if(WAIT_OBJECT_0!=WaitForSingleObject(thread, INFINITE))
    cout<<"Error";
   getch();
   return 0;
}

Проверьте пожалуйста, что не хватает моему коду, для решения моей задачи или может я вообще все делаю не правильно. Готовые решения приветствуются.

Добавлено через 22 часа 27 минут
Кто-нибудь откликнется? Очень нужно.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.01.2013, 21:41     Обработка строки из файла в порожденном процессе(потоке) #6
footbaler, посмотрите прототипы функций. Они у вас явно не верные. И вы не говорили, что писать нужно на винапи.
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
17.01.2013, 23:15  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #7
go, да, не уточнил, что нужно сделать на WINAPI -> недостаток знаний.
Вообще, задание звучит так:
1.Написать и отладить программу, реализующую порожденный процесс.
2.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных процессов (ждущий их завершения или уничтожающий их, в зависимости от варианта).
3.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных потоков (функций) (ждущий их завершения или уничтожающий их, в зависимости от варианта).
Я просто написал свой вариант по заданию.
Я пытаюсь понять что от меня хотят, но пока все тщетно. Очень прошу помочь.
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
19.01.2013, 00:13  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #8
Ну кто-нибудь откликнитесь, подкиньте что-нибудь пожалуйста.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.01.2013, 13:36     Обработка строки из файла в порожденном процессе(потоке) #9
Цитата Сообщение от footbaler Посмотреть сообщение
1.Написать и отладить программу, реализующую порожденный процесс.
Максимум, что можно выжать из этой задачи, так это создание процесса с помощью CreateProcess

Цитата Сообщение от footbaler Посмотреть сообщение
2.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных процессов (ждущий их завершения или уничтожающий их, в зависимости от варианта).
Тоже не знаю, какой у Вас вариант. Порождать потоки с помощью CreateThread
Ну тут несколько процессов создать. Правда не знаю какой у Вас вариант.
Цитата Сообщение от footbaler Посмотреть сообщение
3.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных потоков (функций) (ждущий их завершения или уничтожающий их, в зависимости от варианта).
Добавлено через 1 минуту
Вот на всякий случай ее прототип
C++
1
2
3
4
5
6
7
8
HANDLE WINAPI CreateThread(
  _In_opt_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_       SIZE_T dwStackSize,
  _In_       LPTHREAD_START_ROUTINE lpStartAddress,
  _In_opt_   LPVOID lpParameter,
  _In_       DWORD dwCreationFlags,
  _Out_opt_  LPDWORD lpThreadId
);
А вот прототип call-back функции
C++
1
DWORD ThreadProc (LPVOID lpdwThreadParam )
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
19.01.2013, 17:02  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #10
Цитата Сообщение от go Посмотреть сообщение
Тоже не знаю, какой у Вас вариант.
Методические указания, порядок выполнения и вариант мое работы, в оригинале.
Методические указания.
Проект может быть реализован на Visual C++ 6.0 или в среде Borland C++ 5.0. В первом случае выбирается консольное приложение Win32 без дополнительных библиотек. Во втором случае в программу необходимо добавить файл включения windows.h.
Выбор функции для ожидания завершения порожденных процессов (потоков) зависит от логики работы программы, определяемой вариантом задания.
Уничтожение порожденных процессов (потоков) применяется лишь в тех вариантах, где это действительно необходимо.
Для обмена информацией между процессами рекомендуется использовать файлы. При использовании потоков для обмена информацией целесообразно использовать глобальные переменные.

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

Вариант задания.
Поиск указанной строки в указанном файле. Обработка одной строки в порожденном процессе (потоке).

А теперь, пожалуйста, посмотрите, что тут можно сделать?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.01.2013, 17:21     Обработка строки из файла в порожденном процессе(потоке) #11
footbaler, и так. Для обработки файла целесообразно использовать его отражение в памяти. Далее делите его на части(в зависимости во сколько процессов/потоку будете его одновременно обрабатывать). Каждому потоку передаете свою часть. Для обмена информаций с главным потоком лучше использовать пайпы.
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
19.01.2013, 19:42  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #12
go, у меня есть исходник однокурсницы. У нас один вариант. Ей делал знакомый. Я, в нем, не могу разобраться. Он вообще соответствует заданию?
Код
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdafx.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
 
#define MAX_THREADS 3
#define BUF_SIZE 255
 
char str1[] = {"ГЊГ®Г*äåî"};
char str2[] = {"Fiat"};
char str3[] = {"ÏåðåäГ*"};
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
void ErrorHandler(LPTSTR lpszFunction);
 
int _tmain()
{
    char pDataArray[255] = { str1[255], str2[255],str3[255]};
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
 
    // Create MAX_THREADS worker threads.
 
    for( int i=0; i<MAX_THREADS; i++ )
    {
        // Allocate memory for thread data.
 
        pDataArray[i] = (char) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                sizeof(char));
 
        if( pDataArray[i] == NULL )
        {
           // If the array allocation fails, the system is out of memory
           // so there is no point in trying to print an error message.
           // Just terminate execution.
            ExitProcess(2);
        }
 
        // Create the thread to begin execution on its own.
 
        hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            &pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier 
 
 
        // Check the return value for success.
        // If CreateThread fails, terminate execution. 
        // This will automatically clean up threads and memory. 
 
        if (hThreadArray[i] == NULL) 
        {
           ErrorHandler(TEXT("CreateThread"));
           ExitProcess(3);
        }
    } // End of main thread creation loop.
 
    // Wait until all threads have terminated.
 
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
 
    // Close all thread handles and free memory allocations.
 
    for(int i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
        if(pDataArray[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, &pDataArray[i]);
            pDataArray[i] = NULL;    // Ensure address is not reused.
        }
    }
 
    return 0;
}
 
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{ 
    HANDLE hStdout;
    char pDataArray[255];
 
    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;
 
    // Make sure there is a console to receive output results. 
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;
 
    // Cast the parameter to the correct data type.
    // The pointer is known to be valid because 
    // it was checked for NULL before the thread was created.
  char str[255] = { 0 };
 
    FILE* Infile = NULL;
 
    do
    {
        Infile = fopen("K:\\Work\\free-lance\\Visual C\\Ïîòîêè ÂèêГ*\\cursach\\Debug\\123.txt", "r+");     
    }
    while(Infile == NULL);
    printf("Enter text to find: ");
    fgets(pDataArray, 255, stdin);
    pDataArray[strlen(pDataArray) - 1] = '\0';
    
 
    while(fgets(str, 255, Infile) != NULL)
    {
        char* tmp_ptr = strstr(str, pDataArray);
        while(tmp_ptr != NULL)
        {
            printf("%s", "ГЌГ*éäåГ*Г* ñòðîêГ*");
        }       
    }
 
    fclose(Infile);
 
    return 0; 
} 
 
 
 
void ErrorHandler(LPTSTR lpszFunction) 
{ 
    // Retrieve the system error message for the last-error code.
 
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 
 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
 
    // Display the error message.
 
    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen((LPCTSTR) lpMsgBuf) + lstrlen((LPCTSTR) lpszFunction) + 40) * sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf, 
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 
    MessageBox(NULL, (LPCTSTR) lpDisplayBuf, TEXT("Error"), MB_OK); 
 
    // Free error-handling buffer allocations.
 
    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
}


Добавлено через 40 минут
go, где можно почитать теорию про создание процессов, потоков, что бы максимально понятно было? А то, у меня, уже все перемешалось в голове и я не знаю, что делать.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.01.2013, 22:18     Обработка строки из файла в порожденном процессе(потоке) #13
footbaler, я рихтера читал. Вообще если есть понимание, что такое процесс/поток то только МСДНа хватит. Хотя его и так хватит.

Вообще я по-другому задание понял. Но можно как здесь.
Цитата Сообщение от footbaler Посмотреть сообщение
// Allocate memory for thread data.
pDataArray[i] = (char) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
* * * * * * * * sizeof(char));
Зачем это сделали и нигде не использовали не понятно.

Добавлено через 1 минуту
Т.е. вот это
C++
1
2
3
4
5
6
7
hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            &pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier
Я бы упростил до
C++
1
2
3
4
5
6
7
hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            NULL,          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier
Цитата Сообщение от footbaler Посмотреть сообщение
pDataArray[i] = (char) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
* * * * * * * * sizeof(char));
Т.е. это вообще не надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 15:52     Обработка строки из файла в порожденном процессе(потоке)
Еще ссылки по теме:

C++ Позиционирование в потоке, переставить все нулевые элементы в начало файла
C++ Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения?
Чтение из файла, не все числа читаются в потоке C++

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

Или воспользуйтесь поиском по форуму:
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
20.01.2013, 15:52  [ТС]     Обработка строки из файла в порожденном процессе(потоке) #14
Все, я сдаюсь...
Кто напишет мне код за вознаграждение? Может, увидев как это все выглядит, я пойму, что такое процесс поток и т.д.
Yandex
Объявления
20.01.2013, 15:52     Обработка строки из файла в порожденном процессе(потоке)
Ответ Создать тему
Опции темы

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