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

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

24.05.2014, 21:05. Показов 2658. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Теория всего 6. Судьба неотвратима?
anaschu 21.07.2026
Математическое доказательство Судьбы: Точка бифуркации в едином тензорном ядре Модели ВсегоСвежее обновление питоновского ядра «Soil Chemistry 2. 0» дало нам неопровержимое математическое. . .
Теория всего 5. ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли
anaschu 21.07.2026
Единое ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли Главная задача «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы» (аттракторов. . .
сукцессия 37. Внедрил дипсик в свой оркестр из ИИ. У него закончилось пространство чата, потому опубликую выводы из его работы здесь
anaschu 21.07.2026
==================================================================== КОНТЕКСТ: Моделирование микоризной сукцессии (AM → ECM) ==================================================================== . . .
сукцессия 36. Делаю прогоны модели около порога бифуркации (превращения эндо микоризы в экто микоризу)
anaschu 21.07.2026
СУКЦЕССИЯ МИКОРИЗ: КАК МАТЕМАТИКА ОБЪЯСНЯЕТ ПОДЗЕМНУЮ ВОЙНУ Мы привыкли думать, что лес — это деревья. А грибы — это то, что мы собираем в корзинку осенью. Но если заглянуть под землю, окажется,. . .
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru