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

Нити в winapi

20.03.2015, 14:39. Показов 2209. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите что почитать про нити в winapi? что нибудь чтобы понятно было самое главное ! рихтера не предлагать, читал, ну очень сложно и запутанно... чтобы прямо с нуля на чайниковом языке... уж очень тема для меня лично сложная...

Добавлено через 3 минуты
всякие там критические секции, wait-функции и т.п. тоже очень надо разобраться...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2015, 14:39
Ответы с готовыми решениями:

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

Найти зависимость от расстояния до нити объемной плотности энергии электрического поля нити
Помогите с задачкой, пожалуйста. Бесконечно длинная нить заряжена с линейной плотностью заряда λ. Найдите зависимость от расстояния...

Найдите силу натяжения правой нити сразу после пережигания левой нити
Помогите решить задачу: Шарик массой m=100г подвешен на двух одинаковых нитях длиной a=1мкаждая так, что точки подвеса нитей расположены на...

12
 Аватар для Людвиг Бодмер
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
20.03.2015, 15:15
Rillaxac, можете попробовать Харта или Щупака.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.03.2015, 15:38
Цитата Сообщение от Rillaxac Посмотреть сообщение
рихтера не предлагать, читал, ну очень сложно и запутанно
Цитата Сообщение от Rillaxac Посмотреть сообщение
чтобы прямо с нуля на чайниковом языке...
Дарью Донцову
1
Заблокирован
20.03.2015, 17:15  [ТС]
смотрите мне надо реализовать асинхронное копирование файла в фоновом режиме с помощью одной нити (+ еще одна нить для работы с клавиатурой), ну понятно запрашиваю имя исходного и выходного файлов, открываю их с помощью CreateFile, создаю две нити... (точнее может я что то путаю, я вызываю CreateEvent... а ведь это событие... ну не знаю, у меня тут был какой то образец этой лабы, использовался именно CreateEvent почему то...) тут мое воображение стопорится... мне надо тут где то (я точно знаю) заюзать WaitForMultipleObjects и копировать, но если я ее юзаю у меня все стопорится... т.е. она ждет ждет ждет и так до бесконечности... она ведь должна ждать пока скопируется файл, а он не копируется потому что код дальше не идет...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.03.2015, 17:30
Правильно я понимаю вы работаете в MSVC и у вас обычное оконное WinApi приложение?

И вообще было бы логично выложить свой код или проект полностью на форум, а не пытаться объяснять что либо на пальцах-яйцах...
0
Заблокирован
20.03.2015, 17:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Правильно я понимаю вы работаете в MSVC и у вас обычное оконное WinApi приложение?
мб вы имели ввиду MSVS? (Microsoft Visual Studio) да MSVS, а приложение консольное, только имхо какая тут разница то...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.03.2015, 17:34
Цитата Сообщение от Rillaxac Посмотреть сообщение
только имхо какая тут разница то...
Ибо не совсем понятно:
Ну вообще то есть разница.
Цитата Сообщение от Rillaxac Посмотреть сообщение
еще одна нить для работы с клавиатурой)
Имеется в виду что первичный (основной) поток будет заниматься этим?
0
Заблокирован
20.03.2015, 17:51  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ибо не совсем понятно:
Ну вообще то есть разница.
Цитата Сообщение от Avazart Посмотреть сообщение
Имеется в виду что первичный (основной) поток будет заниматься этим?
блин, да мне самому ничего не понятно... препод говорит на одной лабе одно, не следующей уже совсем по другому... то он говорил что одна нить нужна, то что две... я уже запутался в хлам... сами подумайте сколько тут чисто логически нужно нитей? у меня такое ощущение (сейчас немножко еще почитал, пытаюсь разобраться) что наш препод че то перепутал и сказал две нити, а на самом деле имелись ввиду два события... потому что юзаются тут именно события...
Цитата Сообщение от Avazart Посмотреть сообщение
И вообще было бы логично выложить свой код или проект полностью на форум, а не пытаться объяснять что либо на пальцах-яйцах...
ну в общем как то так...
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
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
 
#define DWORD_CAST(High, Low) (((unsigned long long)High << 32) + (DWORD)Low)
#define HIGH_DWORD(value) (DWORD)((unsigned long long)value >> 32)
 
#define BUFFER_SIZE 0x10000
 
void main()
{
    char sInput[MAX_PATH] = { 0 };
    char sOutput[MAX_PATH] = { 0 };
    HANDLE hInput = NULL;
    HANDLE hOutput = NULL;
    HANDLE hEvent = NULL;
    OVERLAPPED stReader = { 0 };
    OVERLAPPED stWriter = { 0 };
    BYTE pBuffer[BUFFER_SIZE] = { 0 };
    DWORD nFileSizeLow = 0;
    DWORD nFileSizeHigh = 0;
    DWORD nFileSize = 0;
    DWORD nBlockSize = 0;
    DWORD nOffset = 0;
    DWORD nBytesWrite = 0;
    DWORD nBytesRead = 0;
    long long reader_offset = 0;
    long long writer_offset = 0;
 
    //Открытие копируемого файла
    printf("Input filename: ");
    gets(sInput);
    hInput = CreateFileA(sInput, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED|FILE_FLAG_NO_BUFFERING, NULL);
    if (hInput == INVALID_HANDLE_VALUE)
    {
        printf("\nError: %d", GetLastError());
        goto final;
    }
 
    //Открытие выходного файла
    printf("Output filename: ");
    gets(sOutput);
    hOutput = CreateFileA(sOutput, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED|FILE_FLAG_NO_BUFFERING, NULL);
    if (hOutput == INVALID_HANDLE_VALUE)
    {
        printf("\nError: %d", GetLastError());
        goto final;
    }
 
    //Создание нити
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    stReader.hEvent = hEvent;
    stWriter.hEvent = hEvent;
 
    //Получение размера файла
    nFileSizeLow = GetFileSize(hInput, &nFileSizeHigh);
    nFileSize = DWORD_CAST(nFileSizeHigh, nFileSizeLow);
    nBlockSize = nFileSize < BUFFER_SIZE ? nFileSize : BUFFER_SIZE;
 
    //Читать данные из входного в файла и запись в выходной пока смещение меньше размера файла
    while ((nOffset = DWORD_CAST(stReader.OffsetHigh, stReader.Offset)) < nFileSize)
    {
        ResetEvent(stReader.hEvent);
        nBlockSize = nOffset > BUFFER_SIZE ? BUFFER_SIZE : nFileSize - reader_offset;
 
        ReadFile(hInput, pBuffer, nBlockSize, NULL, &stReader);
        WriteFile(hOutput, pBuffer, nBlockSize, NULL, &stWriter);
        WaitForSingleObject(hEvent, INFINITE);
 
        GetOverlappedResult(hOutput, &stWriter, &nBytesWrite, FALSE);
        writer_offset += nBytesWrite;
        stWriter.Offset = (DWORD)writer_offset;
        stWriter.OffsetHigh = HIGH_DWORD(writer_offset);
 
        GetOverlappedResult(hInput, &stReader, &nBytesRead, FALSE);
        reader_offset += nBytesRead;
        stReader.Offset = (DWORD)reader_offset;
        stReader.OffsetHigh = HIGH_DWORD(reader_offset);
 
        memset(pBuffer, 0, BUFFER_SIZE);
    }
 
final:
    CloseHandle(hInput);
    CloseHandle(hOutput);
    getch();
}
Добавлено через 2 минуты
это я написал еще толком ничего не поняв на образце чужого кода... но тут что то не так, во первых одно событие, а надо два, во вторых wait ждет бесконечно и стоит на месте... в общем хз просто вообще я запутался в хлам...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.03.2015, 18:59
Хз, я ничего не понял из этого кода... тут как бы нет потоков, если нужно добавить, то зачем? с какой целью?
0
Заблокирован
22.03.2015, 08:36  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Хз, я ничего не понял из этого кода... тут как бы нет потоков, если нужно добавить, то зачем? с какой целью?
да я сам без понятия... ну смотрите че тут не понятного в коде то? копирование файлов производится путем записи содержимого одного файла в другой
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
27.03.2015, 17:55
Если я правильно понял, задачу перед Вами поставили такую:
Создать дополнительную нить как Вы ее называете (в Windows это называется поток - Thread).
В этой нити у Вас и происходит цикл: асинхронное чтение в буфер из одного файла /асинхронная запись буфера в другой. С помощью WaitForSingleObject Вы ждете окончания этих процедур (о нем вам просигнализируют события - когда операция чтения/записи окончится, WaitForSingleObject пропустит Вас дальше. Зачем это нужно, когда в отдельной нити можно и синхронные чтение/запись использовать - не до конца ясно.
Возможно, преподаватель имел в виду другое - то же самое можно организовать в основной нити. Зачем это нужно - не ясно все равно основная нить будет подвешена.
Возможно, он Вас не любит и хочет чтобы Вы сделали три нити: основная, отдельная для чтения и отдельная для записи. Тогда Вам надо будет запустить чтение файла, дождаться его окончания, дождаться окончания записи, повторить цикл - это нить чтения. Нить записи - дождаться окончания чтения, запустить запись, дождаться окончания записи. Но это слижком уж сложно, врядли он так жесток.
Вообще учебные задачи иногда очень трудно понять, так как к реальной жизни они почти никогда не имеют отношения.
Вам надо уточнить у преподавателя что именно он от Вас хочет, тогда и можно будет о чем то говорить.
2
Заблокирован
02.04.2015, 16:31  [ТС]
Цитата Сообщение от imerlin Посмотреть сообщение
Создать дополнительную нить как Вы ее называете (в Windows это называется поток - Thread).
во первых нить вроде бы уже не надо создавать, берется та нить в которой сам процесс... короче нить создавать не надо
во вторых мой препод говорит что в наиболее известном издании Рихтера переводчик допустил ошибку, после которой все и стали называть нити потоками, а на самом деле Thread переводится как нить, а поток это stream
Цитата Сообщение от imerlin Посмотреть сообщение
В этой нити у Вас и происходит цикл: асинхронное чтение в буфер из одного файла /асинхронная запись буфера в другой. С помощью WaitForSingleObject Вы ждете окончания этих процедур (о нем вам просигнализируют события - когда операция чтения/записи окончится, WaitForSingleObject пропустит Вас дальше.
вот это для меня самое сложное... я никогда не имел дела с потоками, они у нас только начались и честно говоря воспринимают ну очень тяжело...
Цитата Сообщение от imerlin Посмотреть сообщение
Зачем это нужно, когда в отдельной нити можно и синхронные чтение/запись использовать - не до конца ясно.
ну так лаба же такая... на асинхронное чтение / запись
Цитата Сообщение от imerlin Посмотреть сообщение
Возможно, преподаватель имел в виду другое - то же самое можно организовать в основной нити.
вроде бы так и есть
Цитата Сообщение от imerlin Посмотреть сообщение
Зачем это нужно - не ясно все равно основная нить будет подвешена.
в смысле?
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
02.04.2015, 18:07
во вторых мой препод говорит что в наиболее известном издании Рихтера переводчик допустил ошибку, после которой все и стали называть нити потоками, а на самом деле Thread переводится как нить, а поток это stream
Надо же, и правда. Никогда не задумывался.

Originally Posted by imerlin
Зачем это нужно - не ясно все равно основная нить будет подвешена.
в смысле?
Что в смысле? Зачем вообще нужны асинхронные операции? Для того, что бы они "сами" как то выполнялись, а основной поток в это время чем нибудь другим занимался - не "подвешивался". Если же запустить асинхронный процесс и ждать его окончания, то это ничем не будет отличаться от синхронного процесса: запустил, когда он отработал - продолжил работу. Вот так както... Но это, видимо, издержки учебных заданий.

А по поводу потоков ничего сложного нет - это просто параллельно выполняемые программы. Обычно в программе выполнение идет инструкция за инструкцией, функция за функцией. Это и есть поток. Но в многозадачной ОС таких потоков может выполняться довольно много, и программист сам может породить поток(и), который(е) будет(ут) выполняться параллельно с основным. Это даст возможность сбросить долгие и не очень важные задачи в низкий приоритет, например, продолжить диалог с пользователем несмотря на запуск какого то длительного процесса, распараллелить задачу на ядра и т.д.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2015, 18:07
Помогаю со студенческими работами здесь

Найти силу натяжения нити в момент максимального отклонения нити от вертикали после переключения поля
548. Заряженный шарик массой m- 1,5 г, прикрепленный к невесомой изолирующей нити, покоится в однородном горизонтальном электростатическом...

Найти вероятность того, что при вытягивании трех нитей окажется: 1) все нити одного цвета; б) все нити разных
2. В мешке смешаны нити трех цветов: белых 50%, красных – 30%, черных – 20%. Определить вероятность того, что при последовательном...

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

Многопоточность. Нити
Здравствуйте. Пишу mergesort на двух потоках. Для простоты не использую разделяемую память, а просто передаю в тред-функцию границы, где...

Нити и процессы
Посоветуйте хорошую книгу по процессам и нитям, мьютексам и семафорам. Мне предложили книгу А. П. Побегайло - Системное программирование в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru