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

Создание потоков

24.05.2014, 21:05. Показов 2498. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать программу, которая порождает 2 потока. Один записывает информацию в именованный канал, а второй читает её оттуда.
Вроде что-то написал, но не получается запустить потоки . И вот что странно. При создании потока - никакой реакции. Как только доходит до readln - поток запускается и вылетают ошибки (окно сразу закрывается, так что ошибки не увидел, но вроде какие-то Exception'ы). В общем, вот исходник, подскажите, где мои кривые руки накорявили.
Delphi
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
program Lr4;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows,
  Dialogs;
 
type
  Str = array[0..200] of char;
  PThrWriteParams = ^TThrWriteParams;
  TThrWriteParams = record
    PN, Mes: Str;
  end;
 
 
//------------------------------------------------------------------
 
const
 PipeName = '\\\\.\\pipe\\MyPipe';
 
var
  h, hThr1, hThr2: HWND;
  mes: Str;
  ReadStr: Str;
  WriteParams: PThrWriteParams;
  TID: Cardinal;
 
//------------------------------------------------------------------
 
function WriteThread(Param: Pointer):integer;
var
  hPipe: HWND;
  nBytes: Cardinal;
  Params: TThrWriteParams;
begin
 writeln('Write thread started!');
 Params := PThrWriteParams(Param)^;
 
 hPipe := CreateFile(Params.PN,
                     GENERIC_WRITE,
                     0,
                     nil,
                     OPEN_EXISTING,
                     0,
                     0);
 
 if not WriteFile(hPipe, Params.Mes, 100, nBytes, nil) then
   write('WriteFile Error!');
 
 CloseHandle(hPipe);
 EndThread(0);
end;
 
//------------------------------------------------------------------
 
function ReadThread(Parameter: PCardinal):integer;
var
  nBytes: Cardinal;
  hPipe: HWND;
begin
 write('Read thread started!');
 hPipe := Parameter^;
 
 while not ConnectNamedPipe(hPipe, nil) do
   begin
     sleep(1000);
     writeln('Can not connect to pipe!');
   end;
 
 if not ReadFile(hPipe, ReadStr, 100, nBytes, nil) then
   writeln('Can not read data!');
 
 DisconnectNamedPipe(hPipe);
 EndThread(0);
end;
 
begin
 SetLastError(0);
 h := CreateNamedPipe(PipeName,
                      PIPE_ACCESS_DUPLEX,
                      PIPE_TYPE_MESSAGE,
                      100,
                      100,
                      100,
                      0,
                      nil);
 writeln('Write your message:');
 readln(mes);
 
 New(WriteParams);
 WriteParams^.PN := PipeName;
 WriteParams^.Mes := Mes;
 
 hThr1 := BeginThread(nil,
                       0,
                       Addr(WriteFile),
                       PThrWriteParams(WriteParams),
                       0,
                       TID);
  readln;
  writeln(GetLastError);
 
  hThr2 := BeginThread(nil,
                       0,
                       Addr(ReadFile),
                       @h,
                       0,
                       TID);
  readln;
  writeln(GetLastError);
 
 if hThr1 <> 0 then
   CloseHandle(hThr1);
 if hThr2 <> 0 then
   CloseHandle(hThr2);
   
 writeln(ReadStr);
 readln;
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2014, 21:05
Ответы с готовыми решениями:

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

Создание потоков
Всем привет)) Совсем недавно начал изучать WinAPI и еще плохо разбираюсь что к чему. Так вот предо мной возникла такая задача: нужно...

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

32
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
25.05.2014, 22:11  [ТС]
Студворк — интернет-сервис помощи студентам
mss,
Цитата Сообщение от mss Посмотреть сообщение
1. Убери на время отладки создание читающего потока.
Это как?
Цитата Сообщение от mss Посмотреть сообщение
3. Лови брейк на точке входа в пишущий доп.поток
Глупый вопрос, но, точка входа - begin?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.05.2014, 22:14
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
Это как?
К примеру, закомментируй на время все строки, относящие к читающему потоку.

Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
точка входа - begin?
Да.
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
25.05.2014, 22:23  [ТС]
mss, так ты это имел ввиду. К читающему потоку дело даже не доходит. Я же писал уже что вылетает после прохода readln на 102-й строчке. А на брейкпоинте на begin'е пишущего потока остановка не происходит. Т.е. при проходе BeginThread - ничего не происходит, а при проходе readln - вылетает.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.05.2014, 22:35
Ты ликвидировал все потоконебезопасные вызовы в поточных функциях ?

Добавлено через 1 минуту
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
вылетает ..readln на 102-й строчке
Вылет на ReadLn может происходить всего по двум причинам - либо исключение в доп.потоке либо приложение не консольное.

Угадай какая причина твоя)
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
25.05.2014, 22:44  [ТС]
mss, я закомментировал writeln, но результат всё тот же.
Да, и ещё. Слева от каждой строчки, которая выполняется - есть синий кружок (не знаю, как он называется). Так вот, слева от функций потоков - этих кружков нету.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.05.2014, 22:52
Цитата Сообщение от Мизантроп_Лол Посмотреть сообщение
кружков нету
Потому что потчные ф-ции WriteThread и ReadThread ты нигде не запускаешь и вообще никак не используешь.
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
25.05.2014, 23:09  [ТС]
mss, значит ли это, что я прав и они не запускаются, даже с учётом того, что я получаю дескриптор?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.05.2014, 23:10
Именно они не запускаются, но запускаются совсем другие.
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
25.05.2014, 23:32  [ТС]
mss, что же запускается?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.05.2014, 09:58
ReadFile и WriteFile запускаются.
0
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
26.05.2014, 17:43  [ТС]
mss, каким образом? О_о И как это исправить?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.05.2014, 21:38
Лучший ответ Сообщение было отмечено Мизантроп_Лол как решение

Решение

hThr1 := BeginThread(nil,
0,
Addr(WriteFile),
PThrWriteParams(WriteParams),
0,
TID); // вот таким образом

hThr2 := BeginThread(nil,
0,
Addr(ReadFile),
@h,
0,
TID); / и вот таким

Не по теме:

Практически ткнул носом.
По-прежнему будешь утверждать про "не настолько тупой, чтобы не уметь пользоваться гуглом и элементарной логикой" ?)

1
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
28.05.2014, 00:39  [ТС]
mss, спасибо) Львиная доля всех мох ошибок происходит из-за невнимательности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.05.2014, 00:39
Помогаю со студенческими работами здесь

Создание потоков.
Возникла необходимость создать в программе то количество потоков, какое выбрал пользователей. И запустить их все сразу. Я думаю нужно...

Создание потоков
Всем доброго времени суток. Как всегда, последняя надежда на этот сайт. Сразу к делу: Написать программу, которая принимает в качестве...

Создание потоков
Добрый день! Начала знакомство с GPSS и возникли проблемы. Необходимо смоделировать поток событий на , где T=190 , в котором промежутки...

Создание потоков
Разработать программу, определяющую основные параметры загруженности компьютера, работающего под управлением ОС Windows, с использованием...

Создание потоков
Здравствуйте, я создал два потока, но не знаю, как можно проверить, точно ли я их создал и точно ли всё выполняется в отдельном потоке, а...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru