Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/123: Рейтинг темы: голосов - 123, средняя оценка - 4.54
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71

TCPClient && TCPServer Indy Components

24.06.2010, 22:54. Показов 25803. Ответов 51
Метки нет (Все метки)

Всем привет.

Программа пишется в C++ Builder 2010.

Написал Серверную часть чата и Клиентскую часть чата. Естественно не все, что хотелось бы ^_^


Схема идеи:

Client 1-3 Посылают сообщения, которые попадают на сервер. После того как сервер получил сообщение, он записывает сообщение в лог и рассылает его всем Client'aм и тому кто его послал. Вот в принципе и вся идея. Помогите разобраться с этим

Проблема этих программ:
1) При отправке сообщения на сервер используя кириллические символы, сервер отображает символы кириллицы как : "?????????????".


Исходник: Client && Server.rar

Unit1.cpp
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdContext"
#pragma link "IdCustomTCPServer"
#pragma link "IdTCPServer"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    LBT->Caption = "Сервер Отключен";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int con = StrToInt(EConnect->Text);
    ChatServer->Active = false;
    ChatServer->Active = true;
    ChatServer->MaxConnections = con;
    Memo1->Lines->Add("Была нажата кнопка \"Refresh Server\"");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if (ChatServer->Active) {
    LBT->Caption = "Сервер Активен";
 }
 else {
     LBT->Caption = "Сервер Отключен";
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ChatServerExecute(TIdContext *AContext)
{
   int length = AContext->Connection->Socket->ReadLongInt();
   UnicodeString Message = AContext->Connection->Socket->ReadString(length);
   AContext->Connection->Disconnect();
   Memo1->Lines->Add(Message);
   LMessage->Items->Add(Message);
}
//---------------------------------------------------------------------------
Unit1.h

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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "IdBaseComponent.hpp"
#include "IdComponent.hpp"
#include "IdContext.hpp"
#include "IdCustomTCPServer.hpp"
#include "IdTCPServer.hpp"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TIdTCPServer *ChatServer;
    TButton *Button1;
    TEdit *EConnect;
    TLabel *Label1;
    TLabel *LBT;
    TTimer *Timer1;
    TMemo *Memo1;
    TListBox *LMessage;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall ChatServerExecute(TIdContext *AContext);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Клиентская часть.

Unit3.cpp

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdTCPClient"
#pragma link "IdTCPConnection"
#pragma link "IdContext"
#pragma link "IdCustomTCPServer"
#pragma link "IdTCPServer"
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
 
  EHost->Enabled = false;
  EPort->Enabled = false;
  CheckBox1->Caption = "Ввести параметры";
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked) {
    EHost->Enabled = true;
    EPort->Enabled = true;
    EHost->Text = "";
    EPort->Text = "";
    CheckBox1->Caption = "Вернуть настройки";
}  else {
    EHost->Enabled = false;
    EPort->Enabled = false;
    EHost->Text = "192.168.0.102";
    EPort->Text = "6666";
    CheckBox1->Caption = "Ввести параметры";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
 
    ChatClient->Host = EHost->Text; // имя хоста
    ChatClient->Port = 6666;  // номер порта
    ChatClient->Connect();
 
    ChatClient->Socket->Write(EMessage->Text.Length());
    ChatClient->Socket->Write(EMessage->Text);
    ChatClient->Disconnect(); // прерываем соединение
}
//---------------------------------------------------------------------------
Unit3.h

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
//---------------------------------------------------------------------------
 
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "IdBaseComponent.hpp"
#include "IdComponent.hpp"
#include "IdTCPClient.hpp"
#include "IdTCPConnection.hpp"
#include "IdContext.hpp"
#include "IdCustomTCPServer.hpp"
#include "IdTCPServer.hpp"
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published:    // IDE-managed Components
    TEdit *EHost;
    TEdit *EPort;
    TGroupBox *GroupBox1;
    TListBox *LMessage;
    TEdit *EMessage;
    TButton *Button1;
    TGroupBox *GroupBox2;
    TCheckBox *CheckBox1;
    TIdTCPClient *ChatClient;
    void __fastcall CheckBox1Click(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2010, 22:54
Ответы с готовыми решениями:

Это что за иероглифы? if(!((a-4)&~7)&&!!(a-4))
Случайно наткнулся, выражение if(a&gt;=5 &amp; a&lt;=11) &quot;проще&quot; записывается так: if(!((a-4)&amp;~7)&amp;&amp;!!(a-4)) Фигасе проще, что они...

TCPServer и TCPClient
Помогите мне пожалуста разобратся с этими двумя компонентами. Я хочу сделать интернет чат.

Синхронизация TCPClient и TCPServer
Я работаю с C++Builder2006, если кто знает помогите разобраться: Клиент посылает серверу запрос и разрывает соединение. Сервер...

51
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 19:21
Цитата Сообщение от Maikl Til Посмотреть сообщение
Так ты ведь ему значение в 3 байта поставил. Поставь больше и все будет норм или же приравняй к длине значения и пусть сам выбирает сколько ему байт отправлять.
а ты решил проблему? если ставить столько байтов сколько надо, то при повторном чтении он добавляет это значение не к началу строки и выходит за рамки, там видимо после чтения начальная позиция отсчета смещается....

Добавлено через 1 минуту
я так понял что и у тебя выходит считать только 1 раз?

Добавлено через 8 минут
даааааа, РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!

Добавлено через 34 секунды
в ответе сервера надо писать не WriteLn а просто Write)))
0
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 19:22  [ТС]
Цитата Сообщение от StyleT Посмотреть сообщение
если ставить столько байтов сколько надо, то при повторном чтении он добавляет это значение не к началу строки и выходит за рамки, там видимо после чтения начальная позиция отсчета смещается....

покажи код как ты принимаешь и отправляешь сообщения. У меня тоже при получении сообщения была такая же фигня, я после этого вообще изменил все. потому что через бит отправлять это как-то не так.


Я наверное знаю как отправить с сервера сообщение, да так чтобы все было нормально ) Только вот надо подумать нормально =)
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 19:25
вот серва кусок:
C++
1
2
3
Message+=" fucker";
AContext->Connection->IOHandler->Write(Message.Length());
AContext->Connection->IOHandler->Write(Message);
а вот клиент:
C++
1
2
int length = IdTCPClient1->IOHandler->ReadLongInt();
recvmsg = IdTCPClient1->IOHandler->ReadString(length);
это полностью рабочий вариант
0
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 19:29  [ТС]
Цитата Сообщение от StyleT Посмотреть сообщение
вот серва кусок:
C++
1
2
3
Message+=" fucker";
AContext->Connection->IOHandler->Write(Message.Length());
AContext->Connection->IOHandler->Write(Message);
а вот клиент:
C++
1
2
int length = IdTCPClient1->IOHandler->ReadLongInt();
recvmsg = IdTCPClient1->IOHandler->ReadString(length);
это полностью рабочий вариант
А в какие обработчики ты прописываешь это?
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 19:35
Цитата Сообщение от Maikl Til Посмотреть сообщение
А в какие обработчики ты прописываешь это?
серверу в OnExecute после приема и обработки месседжа, а клиенту сразу после отправки, пока не тестил это с высоким пингом, но по идее должно работать

Добавлено через 3 минуты
сделал проверку с имитацией пинга в 500мс, клиент послушно ждет ответа
0
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 19:42  [ТС]
сделал проверку с имитацией пинга в 500мс, клиент послушно ждет ответа
ХА ))) ну ты забавный ) Ну конечно он будет ждать. Это ведь не UDP Соединение, udp теряет много пакетов и вообще может не передать ничего, а TCP пока не передаст месагу, не успокоится )))


Покажи весь код, глянуть хочу, чего ты там понаписал )
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 19:47
Цитата Сообщение от Maikl Til Посмотреть сообщение
ХА ))) ну ты забавный ) Ну конечно он будет ждать. Это ведь не UDP Соединение, udp теряет много пакетов и вообще может не передать ничего, а TCP пока не передаст месагу, не успокоится )))


Покажи весь код, глянуть хочу, чего ты там понаписал )
при неблокирующем типе мог и не ждать, кажется
Осталось прикрутить SSL для авторизации и все буить заибца)

Сервер:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Connect(TIdContext *AContext)
{
    Memo1->Lines->Add("Была создана TCP сессия");
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::IdTCPServer1Disconnect(TIdContext *AContext)
{
     Memo1->Lines->Add("Была разрушена TCP сессия");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
    UnicodeString Message, ip, port;
    ////////////
    int length = AContext->Connection->IOHandler->ReadLongInt();
    Message = AContext->Connection->IOHandler->ReadString(length);
    Memo1->Lines->Add("------------------------------");
    Memo1->Lines->Add(Message);
    ip = AContext->Binding()->PeerIP;
    port = AContext->Binding()->PeerPort;
    Memo1->Lines->Add(ip+":"+port);
    Memo1->Lines->Add("------------------------------");
    Sleep(500);
    Message+=" fucker";
    AContext->Connection->IOHandler->Write(Message.Length());
    AContext->Connection->IOHandler->Write(Message);
}
//---------------------------------------------------------------------------
Клиент:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    IdTCPClient1->Host= eIP->Text;
    IdTCPClient1->Port= StrToInt(ePort->Text);
    try
    {
        IdTCPClient1->Disconnect();
        IdTCPClient1->Connect();
    }
    catch(...)
    {
        ShowMessage("Не удалось подключиться к серверу!");
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    try
    {
        IdTCPClient1->Connect("localhost");
    }
    catch(...)
    {
        ShowMessage("Не удалось подключиться к серверу!");
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(IdTCPClient1->Connected())
    {
        String mesg=Edit1->Text, recvmsg="r";
        IdTCPClient1->IOHandler->Write(mesg.Length());
        IdTCPClient1->IOHandler->Write(mesg);
        int length = IdTCPClient1->IOHandler->ReadLongInt();
        recvmsg = IdTCPClient1->IOHandler->ReadString(length);
        Memo1->Lines->Add("Ответ: "+recvmsg);
    }
    else
    {
        ShowMessage("Нет соединения с сервером!");
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    IdTCPClient1->Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Connected(TObject *Sender)
{
    Memo1->Lines->Add("Клиент подключен к серверу");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Disconnected(TObject *Sender)
{
    Memo1->Lines->Add("Связь с сервером прервана");
}
//---------------------------------------------------------------------------
0
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 19:56  [ТС]
Цитата Сообщение от StyleT Посмотреть сообщение
Осталось прикрутить SSL для авторизации и все буить заибца)
А это как реализовать ?


Так я понимаю у тебя просто

C++
1
2
3
        Message =" fucker";
        AContext->Connection->IOHandler->Write(Message.Length());
        AContext->Connection->IOHandler->Write(Message);
Отсылает значение "Message" Ну если честно, это фигня. А вот как сделать, как я приводил раннее схему. То есть: Клиент отправляет мессагу, сервер получает и обрабатывает ее, и потом сервер посылает ее обратно.
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 20:07
Цитата Сообщение от Maikl Til Посмотреть сообщение
А это как реализовать ?
ну к HTTP клиенту я смог прикрутить, думаю и с этим выйдет, там компонентик есть такой, вроде ничего сложного...

Цитата Сообщение от Maikl Til Посмотреть сообщение
Отсылает значение "Message" Ну если честно, это фигня. А вот как сделать, как я приводил раннее схему. То есть: Клиент отправляет мессагу, сервер получает и обрабатывает ее, и потом сервер посылает ее обратно.
но помнится ты не мог корректно считать этот ответ) да и мне больше не надо, сервер будет игровой, так что он только и будет делать что принимать запросы и их обрабатывать, а если ты хочешь что б серв по своей инициативе отправлял данные так это бред не надо превращать серв в клиент, но если уж приспичит то все по этой же схеме, но без считывания перед этим)
0
 Аватар для Maikl Til
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 20:27  [ТС]
Цитата Сообщение от StyleT Посмотреть сообщение
ну к HTTP клиенту я смог прикрутить, думаю и с этим выйдет, там компонентик есть такой, вроде ничего сложного...
А что за компонент ?
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 22:13
Цитата Сообщение от Maikl Til Посмотреть сообщение
А что за компонент ?
TIdServerIOHandlerSSLOpenSSL - для серва
TIdSSLIOHandlerSocketOpenSSL - для клиента

Добавлено через 45 минут
тут другая диллема, надо каждому коннекту присвоить id как бы это учудить?
0
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1
10.01.2012, 14:04
Помогите мне, я не понял а как сделать рассылку от сервера к 3 клиентам, всю тему прочёл но ответа не увидел
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
19.08.2015, 23:36
Вы знаете, У меня по каким то причинам этот ваш "Connection" не член для IdTCPServer... Как быть? Как осуществить прием данных от Клиента?
C++
1
2
3
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
  int length = IdTCPServer1-> //И нет такого
Использую XE7.

Как осуществить отправку строки клиенту? И как отправить строку строго определенному клиенту, ведь их может быть несколько? Например выбрав его из списка подключенных клиентов? Список в Memo...
Подскажите, дайте совет.
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
20.08.2015, 23:59
C++
1
Form1->Memo1->Lines->Add(Form1->IdTCPServer1->IOHandler-> //НЕТ дальше метода write()
И похожего на него тоже нет. С чем я таким столкнулся в чем дело?
Отличный топик, о том что надо. Но методов таких у классов нет. Что за ...
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,181
Записей в блоге: 3
21.08.2015, 00:46
Топик был создан еще времен BCB6,сейчас так
C++
1
2
3
4
5
6
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
 
     AContext->Connection->IOHandler.......
}
//---------------------------------------------------------------------------
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
21.08.2015, 00:59
Сейчас, момент. Картинку вставлю сюда.

Тут картинка показывающая что Connection это не метод и не подкласс в классе IdTCPServer
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,181
Записей в блоге: 3
21.08.2015, 09:11
Цитата Сообщение от newline Посмотреть сообщение
Тут картинка показывающая что Connection
где на скрине Connection ?
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
21.08.2015, 18:32
А вот и в том то и дело что нет его!!!
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,181
Записей в блоге: 3
21.08.2015, 19:29
newline, Вы наверное путаете TServerSocet
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
21.08.2015, 23:06
Я специально сохранил оригинальное имя компонента, во избежание неправильного понимания. Компонент INDY называется IdTCPServer. Ну и IdTCPClient тоже. Согласно найденным примерам в инете и на просторах данного сайта должны быть такие методы. А нету. На скриншоте показаны имеющиеся компоненты...

Добавлено через 3 часа 20 минут
Indy Version 10.6.2.5263.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2015, 23:06

Снова TCPServer и TCPClient
Пытаюсь сделать программку по этой статье,...

Передача файлов через TcpServer и TcpClient
Добрый день, уважаемые форумчане. Столкнулся я со следующей задачей. Мне необходимо передать файл с одного компьютера на другой, используя...

TcpServer и TcpClient, как переслать сообщение
Как работать с TcpServer и TcpClient в C++Builder 2010? Например, как переслать сообщение от клиента к серверу и обратно?

Оператор && - добавить в одну строчку Memo текст с ListBox1 и ListBox2
значит нужно добавить в одну строчку Memo текст с ListBox1 и ListBox2 хотел реализовать через оператор &quot;и&quot; &amp;&amp; но видает...

Rad studio XE3 && OpenGL
скачал отсюда библиотеки http://www.onlinedisk.ru/file/620466/ glut.dll and glut32.dll скопировал в windows/system32 glut.h и glaux.h...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru