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

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

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

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

16.12.2012, 14:02. Просмотров 888. Ответов 13
Метки нет (Все метки)

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

Обработка ошибок в процессе написания кода - C++
Допустим есть большая программа. Десяток(ки) файлов, файлы эти в папках. Часто используется проверка в функциях на адекватные...

Обработка строки из файла - C++
Получаю строку из файла. CLogFile* logFileObj=NULL; logFileObj=new CLogFile(FileName); CString line; BOOL...

Обработка конца строки при загрузке из файла - C++
День добрый. Помогите, пожалуйста. Исходные данные. Есть класс: class ThingPtr { string word; vector <int>...

ИНИ-файл. Обработка файла. Строки. (Только для умелых) - C++
С помощью ini-файлов в Windows записываются настройки приложений. Каждая строка ini-файла либо определяет некоторое значение, либо начинает...

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

Чтение из файла, не все числа читаются в потоке - C++
Здравствуйте! Написал программку которая создает массив из случайных символов, записывает его в файл и читает потом файл в другой массив....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.12.2012, 14:07 #2
footbaler, порождаете поток std::thread.
1
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
16.12.2012, 14:15  [ТС] #3
go, спасибо, но если бы примерный код увидеть, я бы начал понимать, что к чему.
0
go
Эксперт C++
3586 / 1366 / 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));
1
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 минут
Кто-нибудь откликнется? Очень нужно.
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.01.2013, 21:41 #6
footbaler, посмотрите прототипы функций. Они у вас явно не верные. И вы не говорили, что писать нужно на винапи.
1
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
17.01.2013, 23:15  [ТС] #7
go, да, не уточнил, что нужно сделать на WINAPI -> недостаток знаний.
Вообще, задание звучит так:
1.Написать и отладить программу, реализующую порожденный процесс.
2.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных процессов (ждущий их завершения или уничтожающий их, в зависимости от варианта).
3.Написать и отладить программу, реализующую родительский процесс, вызывающий и отслеживающий состояние порожденных потоков (функций) (ждущий их завершения или уничтожающий их, в зависимости от варианта).
Я просто написал свой вариант по заданию.
Я пытаюсь понять что от меня хотят, но пока все тщетно. Очень прошу помочь.
0
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
19.01.2013, 00:13  [ТС] #8
Ну кто-нибудь откликнитесь, подкиньте что-нибудь пожалуйста.
0
go
Эксперт C++
3586 / 1366 / 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 )
1
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.
Выбор функции для ожидания завершения порожденных процессов (потоков) зависит от логики работы программы, определяемой вариантом задания.
Уничтожение порожденных процессов (потоков) применяется лишь в тех вариантах, где это действительно необходимо.
Для обмена информацией между процессами рекомендуется использовать файлы. При использовании потоков для обмена информацией целесообразно использовать глобальные переменные.

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

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

А теперь, пожалуйста, посмотрите, что тут можно сделать?
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.01.2013, 17:21 #11
footbaler, и так. Для обработки файла целесообразно использовать его отражение в памяти. Далее делите его на части(в зависимости во сколько процессов/потоку будете его одновременно обрабатывать). Каждому потоку передаете свою часть. Для обмена информаций с главным потоком лучше использовать пайпы.
1
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, где можно почитать теорию про создание процессов, потоков, что бы максимально понятно было? А то, у меня, уже все перемешалось в голове и я не знаю, что делать.
0
go
Эксперт C++
3586 / 1366 / 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));
Т.е. это вообще не надо.
1
footbaler
1 / 1 / 0
Регистрация: 18.12.2010
Сообщений: 50
20.01.2013, 15:52  [ТС] #14
Все, я сдаюсь...
Кто напишет мне код за вознаграждение? Может, увидев как это все выглядит, я пойму, что такое процесс поток и т.д.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 15:52
Привет! Вот еще темы с ответами:

Warcraft: работа каждого юнита реализуется в порожденном процессе потоке - C#
Warcraft. Заданное количество юнитов добывают золото равными порциями из одной шахты, задерживаясь в пути на случайное время, до ее...

Обработка ошибок в потоке - C#
Здравствуйте! Проблема у меня состоит в следующем: Запускаю я метод в Task и обрабатываю все в try catch. Ошибка вылетает - ловлю и...

Обработка данных в новом потоке - C#
Столкнулся с такой проблемой в приложении WinForm нужно создать поток. В этом потоке будут обрабатываться данные (оч. много и очень долго)....

Обработка события COM в отдельном потоке - Delphi
Всем привет! Создал обертку COM сервера стандартными функциями Delphi. На выходе получил класс TStServer для работы с COM: ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.01.2013, 15:52
Ответ Создать тему
Опции темы

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