Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184

Создать оконный интерфейс для программы, которая ищет файлы в два потока

10.05.2015, 01:49. Показов 1640. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется функция поиска файла по маске и два потока.15. Вторичный поток ищет файлы в заданном каталоге по маске.
Как сделать оконный интерфейс и выводить не в консоль а в listbox?


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
DWORD WINAPI FolderSearch(LPVOID param)
{
    WIN32_FIND_DATAA fd;
    LONGLONG nFileLen = 0;
    //ищем первый файл
    HANDLE hf = FindFirstFileA((LPCSTR)param,&fd);
    if (hf != INVALID_HANDLE_VALUE)
    {
        //записываем в лог
        nFileLen = (fd.nFileSizeHigh * (MAXDWORD + 1)) + fd.nFileSizeLow;
        cout << fd.cFileName << " " << nFileLen;
        
        while (FindNextFileA(hf, &fd))
        {
            nFileLen = (fd.nFileSizeHigh * (MAXDWORD + 1)) + fd.nFileSizeLow;
            cout << fd.cFileName << " " << nFileLen << endl;
        }
        //освобождаем ресурсы поиска файлов
        FindClose(hf);
    }
    return 0;
}
 
void thread_0()
{
    int i;
    for (i = 0; i < 5; i++)
    {
        cout << i << ' ' << endl;
        Sleep(500);
    }
    cout << endl;
}
void thread_1()
{
    int i;
    for (i = 5; i < 10; i++)
    {
        cout << i << ' '<< endl;
        Sleep(500);
    }
    cout << endl;
}
int main()
{
    printf("Input file mask for search:  ");
    string mask;
    //ввод маски
    cin >> mask;
    printf("Input folder %d with \\:");
    string folders;
    cin >> folders;
 
    HANDLE hThread[2];
    DWORD dwThread[2];
    // запускаем первый поток 
    folders.append(mask);
    hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FolderSearch,
        (LPVOID)folders.c_str(), 0, &dwThread[0]);
    if (hThread[0] == NULL)
        return GetLastError();
 
    // запускаем второй поток 
    hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_1,
        NULL, 0, &dwThread[1]);
    if (hThread[1] == NULL)
        return GetLastError();
    
        // ждем завершения потоков thread_1 и thread_2 
    if (WaitForMultipleObjects(2, hThread, TRUE, INFINITE) == WAIT_FAILED)
    {
        cout << "Wait for multiple objects failed." << endl;
        cout << "Press any key to exit." << endl;
    }
    // закрываем дескрипторы потоков thread_0 и thread_1 
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2015, 01:49
Ответы с готовыми решениями:

Как создать не стандартный оконный интерфейс программы (боковое меню)
Всем Доброго Дня! Подскажите пожалуйста, как создать не стандартное окно в программе, а что то подобное: окно состоит из 2...

Оконный интерфейс для программы решения СЛАУ методом Гаусса
Добрый день! Мне надо сделать оконный интерфейс для решения слау методом гаусса! Помогите или посоветуйте как это сделать) Спасибо! ...

Требуется создать оконный вариант программы , которая умеет обрабатывать информацию и выдавать результат
Требуется создать оконный вариант программы , которая умеет обрабатывать информацию и выдавать результат , просто напросто калькулятор

15
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 07:34
Лучший ответ Сообщение было отмечено rockstarone как решение

Решение

Цитата Сообщение от rockstarone Посмотреть сообщение
Как сделать оконный интерфейс и выводить не в консоль а в listbox?
Создаёшь окно, в нём дочернее класса LISTBOX, хэндл на дочернее делаешь доступным в потоке (глобальный объект или в параметре передашь при создании потока). А потом как поток что-нибудь найдёт, так добавляет строчку в окно, хэндл соответствующего окна для этого у него имеется. Ввод через окно типа EDIT, текст оттуда получать с помощью GetWindowText().
1
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 10:25  [ТС]
Enno, а где закрывать потоки?в каком сообщении?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 12:03
rockstarone, что ты имеешь ввиду под "закрывать"? Они сами когда дойдут до return своей функции завершатся. Определись с тем можно ли прерывать или приостанавливать поиск, можно ли будет осуществлять новый поиск.
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 12:07  [ТС]
Enno, да мне нужно сделать чтобы можно было приостановить и восстановить поиск.

Добавлено через 49 секунд
Enno, Почему при одном нажатии на кнопку не срабатывает второй поток который выводит файлы. А при втором нажатии зависает

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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
// WinAPI32_090315.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <utility>
#include <string> 
#define ID_EDITONE 1
#define ID_EDITTWO 2
#define ID_LIST 502
#define ID_BUTTON 10000
 
using namespace std;
ATOM    RegisterClassMain(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
int i = 0;
HWND hList;
 
string mask;
string folders;
 
HANDLE hThread[2];
DWORD dwThread[2];
HANDLE hSemaphore;
DWORD WINAPI FolderSearch(LPVOID param)
{
    ofstream f;
    f.open("input.txt", ios::out);
    WIN32_FIND_DATAA fd;
    LONGLONG nFileLen = 0;
    //ищем первый файл
    HANDLE hf = FindFirstFileA((LPCSTR)param, &fd);
    if (hf != INVALID_HANDLE_VALUE)
    {
        WaitForSingleObject(hSemaphore, INFINITE);
        //записываем в лог
        nFileLen = (fd.nFileSizeHigh * (MAXDWORD + 1)) + fd.nFileSizeLow;
        //SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)fd.cFileName);
        f << fd.cFileName << " " << nFileLen;
        ReleaseSemaphore(hSemaphore, 1, NULL);
        while (FindNextFileA(hf, &fd))
        {
            WaitForSingleObject(hSemaphore, INFINITE);
            nFileLen = (fd.nFileSizeHigh * (MAXDWORD + 1)) + fd.nFileSizeLow;
            //SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)fd.cFileName);
            f << fd.cFileName << " " << nFileLen << endl;
            ReleaseSemaphore(hSemaphore, 1, NULL);
        }
        //освобождаем ресурсы поиска файлов
        FindClose(hf);
    }
    return 0;
}
void thread_0()
{
    ifstream fin("input.txt");
    vector <pair <int, string> > v;
    pair <int, string> p;
    while (fin >> p.second >> p.first)
    {
        v.push_back(p);
    }
    sort(v.rbegin(), v.rend());
    for (size_t i = 0; i < v.size(); ++i)
    {
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)v[i].second.c_str());
    }
    fin.close();
}
void thread_1()
{
    int i;
    for (i = 5; i < 10; i++)
    {
        //cout << i << ' ' << endl;
        Sleep(500);
    }
    //cout << endl;
}
ATOM RegisterClassMain(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetSysColor(COLOR_DESKTOP);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "MainWindow";
    wcex.hIconSm = NULL;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
 
    return RegisterClassEx(&wcex);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
    RegisterClassMain(hInstance);
    if (!InitInstance(hInstance, nCmdShow))
    {
        return FALSE;
    }
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    hInst = hInstance;
 
    HWND hWndMain = CreateWindow(
        "MainWindow",
        "MainWindow",
        WS_OVERLAPPEDWINDOW,
        550,
        100,
        500,
        500,
        NULL,
        NULL,
        hInstance,
        NULL);
    if (!hWndMain)
    {
        return FALSE;
    }
    ShowWindow(hWndMain, nCmdShow);
    UpdateWindow(hWndMain);
    return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    
    static HWND hEditOne, hEditTwo, hbutton;
    static HWND hOneScroll, hTwoScroll;
    static int nxPos, nxMin, nxMax, nyPos, nyMin, nyMax;
    switch (message)
    {
    case WM_CREATE:
        hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
        hList = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
            30, 30, 200, 400, hWnd, (HMENU)ID_LIST, hInst, NULL);
        hbutton = CreateWindow("button", "Input", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            260, 140, 70, 30, hWnd, (HMENU)ID_BUTTON, hInst, NULL);
        hEditOne = CreateWindow("Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 260, 30, 100, 30, hWnd, NULL, hInst, NULL);
        hEditTwo = CreateWindow("Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 260, 80, 100, 30, hWnd, NULL, hInst, NULL);
        break;
    case WM_COMMAND:
    {   switch (LOWORD(wParam))
    {
    case ID_BUTTON:
    {
        char pchText[1000];  // Ну естественно можно GetWindowTextLength, но, в данном случае, не суть...
        GetWindowText(hEditOne, pchText, 1000);
        mask = pchText;
 
        char pchText2[1000];  // Ну естественно можно GetWindowTextLength, но, в данном случае, не суть...
        GetWindowText(hEditTwo, pchText2, 1000);
        folders = pchText2;
 
        // запускаем первый поток 
        folders.append(mask);
        hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FolderSearch,
            (LPVOID)folders.c_str(), 0, &dwThread[0]);
        if (hThread[0] == NULL)
            return GetLastError();
 
        hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_0,
            NULL, 0, &dwThread[1]);
        if (hThread[1] == NULL)
            return GetLastError();
 
        //  запускаем второй поток 
 
        //ждем завершения потоков thread_1 и thread_2 
         if (WaitForMultipleObjects(2, hThread, TRUE, INFINITE) == WAIT_FAILED)
         {
        /*  cout << "Wait for multiple objects failed." << endl;
          cout << "Press any key to exit." << endl;*/
         }
        // закрываем дескрипторы потоков thread_0 и thread_1 
      CloseHandle(hThread[0]);
        CloseHandle(hThread[1]);
                     
            return TRUE;
    }; break;
 
    }
    }; break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
 
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 12:43
hSemaphore на кой тебе, ты ведь в одном потоке с ним играешься?
Цитата Сообщение от rockstarone Посмотреть сообщение
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_0
thread_0 никоим образом не подходит под типа функции потока. Да и зачем тебе ещё один поток?
Цитата Сообщение от rockstarone Посмотреть сообщение
return GetLastError();
Оу, вот так в функции окна делать нельзя, если об этом специально не сказано. Возвращай всегда 0, если ты взялся обрабатывать сообщение. Дальше не смотрел.
Рекомендую написать класс, вызывая функции которого будет осуществляться запуск потока. В класс закидывай функцию "вывода на экран", паузу, пуск, стоп. И вот для консольного приложения (начни с него), функция "вывода на экран" будет что-то типа:
C++
1
2
3
4
void output_str(char* str)
{
cout<<str<<endl;
}
А для оконного:
C++
1
2
3
4
5
void output_str_gui(char* str)
{
//не забудь подключить windowsx.h
ListBox_AddString(hList, str);
}
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 13:37  [ТС]
Enno, а на что заменить thread_0 . а без класса нельзя сделать, так как я сейчас делаю?

Добавлено через 1 минуту
Enno, второй поток по заданию у меня нужен. Вторичный поток ищет файлы в заданном каталоге по маске. Главный поток выводит файлы в порядке убывания размера файлов

Добавлено через 1 минуту
Enno, у меня вывод работает со второго нажатия на клавишу если не писать
C++
1
2
3
WaitForMultipleObjects(2, hThread, TRUE, INFINITE); 
CloseHandle(hThread[0]);
        CloseHandle(hThread[1]);
Добавлено через 44 минуты
Enno, нужно синхронизировать потоки? чтобы при одном нажатии и писало в файл и выводило ?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 14:01
Цитата Сообщение от rockstarone Посмотреть сообщение
а без класса нельзя сделать, так как я сейчас делаю?
Геморрой тебе зачем?
Цитата Сообщение от rockstarone Посмотреть сообщение
Главный поток выводит файлы в порядке убывания размера файлов
"Главный поток" это первичный что ли? Пока все файлы не найдёшь всё равно ведь выводить не будешь.
Цитата Сообщение от rockstarone Посмотреть сообщение
нужно синхронизировать потоки? чтобы при одном нажатии и писало в файл и выводило ?
Тебе разве необходимо чтобы отдельный поток записывал в файл?
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 14:04  [ТС]
Enno, да отдельный поток записывает в файл а другой ищет.

Добавлено через 19 секунд
Enno, я не знаю как с классами сделать. можешь показать пожалуйста

Добавлено через 1 минуту
Enno, нужно чтобы один поток искал файлы а другой выводил в порядке убывания размера файла
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 14:13
Цитата Сообщение от rockstarone Посмотреть сообщение
да отдельный поток записывает в файл а другой ищет.
Тогда синхронизируй.
Цитата Сообщение от rockstarone Посмотреть сообщение
я не знаю как с классами сделать
Что именно подсказать? Как класс написать? Если ответ на сей вопрос утвердительный, то это надо читать книжки, ибо перепечатывать сотни страниц у меня нет желания.
Цитата Сообщение от rockstarone Посмотреть сообщение
нужно чтобы один поток искал файлы а другой выводил в порядке убывания размера файла
Есть вариант ассоциированния с каждой записью в listbox значения равного размеру файла в байтах (есть такая штука для listbox). А потом пробегайся по всем записям и находи первую у которой ассоциированное значение меньше(для убывающего порядка) и вставляй строчку с именем файла за ней (это тоже можно сделать в listbox). Но ты должен понимать что каждый раз мотаться по списку файлов будет долго. Хотя есть функции сортировки содержимого listbox, и один из стандартный методов ориентируется именно на это ассоциированное значение.
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 14:32  [ТС]
Enno, так как синхронизировать? у меня не получается .
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 18:40
Цитата Сообщение от rockstarone Посмотреть сообщение
так как синхронизировать?
С помощью event'а можешь. Или крит.секцию возьми. Как хочешь. Для начала определи когда кто должен выполняться, а когда ждать.
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
10.05.2015, 18:44  [ТС]
Enno, а можешь в коде у меня пример показать, я не понимаю как сделать
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.05.2015, 03:50
rockstarone, чувак, у тебя в коде пока нечего синхронизировать, сам код убитый, сначала его правь.
0
13 / 13 / 9
Регистрация: 23.10.2014
Сообщений: 184
11.05.2015, 11:20  [ТС]
Enno, в чем кривость? и как поменять так, чтобы было не криво?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.05.2015, 13:02
rockstarone,
Начни с того что составь модель работы твоей программы, не на сиплюсплюс, а на псевдокоде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.05.2015, 13:02
Помогаю со студенческими работами здесь

Создать программу, которая ищет в указанном каталоге файлы, удовлетворяющие заданной маске
Создать программу, которая ищет в указанном каталоге файлы, удовлетворяющие заданной маске, и дата последней модификации которых находится...

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

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

Создать интерфейс для программы
Помогите сделать интерфейс данной программы Program Kursach; uses crt; const n=6; m=6; var a:array of integer; ...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru