13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285

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

24.05.2014, 21:05. Показов 2559. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru