Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810

std::thread - как запустить поток отложенно?

02.05.2023, 11:08. Показов 6837. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В заголовке вопрос в общем-то.

Я вот этот момент в новомодном С++ не могу никак понять: как создать объект потока, но запустить выполнение потока его позже, не в конструкторе?
Почему нет такого варианта в std::thread? или я не вижу?
как так странно всё задизайнено?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2023, 11:08
Ответы с готовыми решениями:

Std::thread как усыпить/ пробудить поток?
Есть ли в std::thread возможность как - то приостановить поток, не разрушая его, а потом, по какому - то сигналу / прерыванию - возобновить...

Как остановить поток std::thread ? Есть ли более подходящие аналоги?
Итак, в моей игре код разделён на два потока, основной - рендеринг и прочее, второй - расчёт физики. void qqq() { while (true) {...

Как удалить зависший std::thread::detach поток без внедрения туда дополнительной контролирующей логики
Здравствуйте, имеет ли кто-то ссылочку на какой-нибудь ресурс где случайно окажется возможным для скачивания файл с книгой "Энтони...

77
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.05.2023, 17:55  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
читайте весь пост:
Вы мне предлагаете почитать?
Так я почитал и недоумеваю.

По-моему, вариант с std::unique_ptr<std::thread> тогда, когда еще не было (ну в рамках этой ветки) понятно про то, что оператор = для потока не выполняет создание нового объекта и "копирование", а просто "забирает вновь созданный поток себе".
Ну я так это увидел.

Но т.к. про = обсудили - то уже не понятно зачем за std::unique_ptr теперь держаться.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 17:58
Цитата Сообщение от zayats80888 Посмотреть сообщение
В посте #33 это было именно требование, и вы просили показать, как это сделать, очевидно, не удовлетворившись кодом из поста #3.
Конечно, мне не понравилось наличие двух std::thread, и я предложил альтернативу где используется один thread. Следовательно, если моя альтернатива по вашему плохая, то наверное было бы неплохо если бы и вы предоставили свою альтернативу или как-то подкрепили то, что два объекта thread лучше одного или же они равнозначны по семантике. Попытки конечно были, но как по мне, они не увенчались успехом

Все это выглядит как попытка продать что-то вместе с чем-то. Скорее всего многие с этим сталкивались, когда хочешь купить что-то одно, но тебе говорят, что ты не можешь это купить, не купив еще кое-что другое. Это то, чего я не понимаю (мне нужен один поток, я могу это сделать создав один объект потока, ну вот одного объекта и должно быть достаточно).

имхо, думаю нет особого смысла продолжать, позиции всех сторон ясны, у каждого может быть свое видение ситуации, и это нормально
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
02.05.2023, 18:03
Цитата Сообщение от Undisputed Посмотреть сообщение
имхо, думаю нет особого смысла продолжать, позиции всех сторон ясны, у каждого может быть свое видение ситуации, и это нормально
согласен
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.05.2023, 18:28
Цитата Сообщение от KSergey9 Посмотреть сообщение
для потока не выполняет создание нового объекта
Вообще std::thread - объект, управляющий потоком, в котором выполняется переданная функция. Как только передадите функцию - std::thread начнёт её выполнять в другом потоке. Обсуждавшиеся в теме способы обновлять объект std::thread, так, чтобы функцию передали для запуска в нужный момент - только детали способа хранения std::thread. Запускать поток всё равно вызовом конструктора с функцией, считаемой в потоке, и прочими её аргументами.

Вызовов для "замораживания" или "прекращения" потока у std::thread всё равно нет. Управлять выполнением потока надо мьютексами и атомарными переменными.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.05.2023, 20:20
Цитата Сообщение от KSergey9 Посмотреть сообщение
то уже не понятно зачем за std::unique_ptr теперь держаться.
Так тут только один человек за него держится и это не я.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Так я почитал и недоумеваю.
Из-за чего?
Я всю дорогу говорю о том, что вариант с динамическим std::thread внутри std::unique_ptr ничем не лучше, чем обычное использование std::thread. А вы сейчас о чем?

Добавлено через 11 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
они равнозначны по семантике
Они равнозначны по семантике потому что делают одно и то же: передают ресурс во владение. Без динамической памяти ресурсом выступает непосредственно implementation-defined хэндл созданного потока, который перемещается из временного объекта потока в именованный объект потока. В твоем случае с динамической памятью точно так же ресурс перемещается из временного объекта, возращенного new, в именованный объект unique_ptr. При этом в обоих случаях хэндл открытого потока будет один единственный (т.к. он создается именно вызовом конструктора в параметром). С точки зрения семантики как раз все равно, был ли этот хэндл "перемещен" сам по себе или мы "переместили" указатель на него передав владение этим указателем. Что так, что так, в итоге владение хэндлом потока оказывается в именованном объекте, только в первом случае прямо, а во втором, твоем, случае - косвенно, через владение указателем.
Итого
1) Семантика перемещения - есть в обоих случаях
2) Семантика владения - есть в обоих случаях
ЧТД.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.05.2023, 06:23
Цитата Сообщение от KSergey9 Посмотреть сообщение
А зачем вот это вообще все, когда тоже самое?
ни за чем.
нормальные люди вот так и делают:
C++
1
2
3
std::thread trd;
// ...
trd = std::thread(func);
Цитата Сообщение от KSergey9 Посмотреть сообщение
как так странно всё задизайнено?
новички иногда спрашивают как лучше: передать параметр через конструктор, или сделать сеттер?

что лучше, так:
C++
1
2
some obj {param};
obj.run();
или так?
C++
1
2
3
some obj;
obj.set(param);
obj.run();
правильный ответ:
всегда нужно по возможности отдавать предпочтение первому варианту.

если есть техническая возможность, то вариант с RAII предпочтительнее.

почему так?
во втором варианте необходимо учесть,
что, теоретически, метод set может быть вызван из разных потоков.
и поэтому, для обеспечения инварианта класса (для безопасной работы)
необходимо предусмотреть многопоточную синхронизацию (мутекс, например).

и вот здесь начинается неиллюзорное усложение кода,
и просадка производительности.
и метод set, и метод run нужно будет защищать тормозным мутексом.
а наличие мутекста в свою очередь потребует реализовывать конструкторы копии,
и пошло-поехало.

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


запомни раз и навсегда:
1. сеттеры - зло (хотя порой - необходимое)
2. конструкторы в целом, и RAII в частности - твои лучшие друзья в многопоточном мире.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
03.05.2023, 10:54  [ТС]
Хотелось бы уточнить:
Цитата Сообщение от hoggy Посмотреть сообщение
во втором варианте необходимо учесть,
что, теоретически, метод set может быть вызван из разных потоков.
Это вы написали потому, что в данной теме про std::thread речь, или потому что любой класс вообще на ваш взгляд должен думать про многопоточность?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 11:21
DrOffset,
Думаю мы говорим о разных вещах. Все что ты написал, это рассуждения на уровне деталей реализации, на уровне того, что происходит под капотом. Но я изначально ставил акцент на абстракции экземпляре класса std::thread. Поэтому, челендж все же остается открытым

То есть, твое утверждение выглядит примерно так:
C++
1
class point {int x; int y;};
это эквивалент
C++
1
class clock {int hours, int minutes;};
потому что реализация одинаковая.

Но я думаю, что это некорректное суждение. С точки зрения реализации эти две вещи могут напоминать чем-то друг друга или даже быть эквивалентными, но в предметной области это две разные вещи.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 11:39
Цитата Сообщение от Undisputed Посмотреть сообщение
То есть, твое утверждение выглядит примерно так:
Нет, не так.
Реализация тут вообще не при чем. Я же с первого сообщения сказал, что ты пытаешься наделить семантикой перемещения объект, который и так ей обладает.
То, что thread обладает этой семантикой, заявлено в его интерфейсе. Аналогично для unique_ptr. Нет нужды смотреть в реализацию. Хэндл я упомянул лишь затем, чтобы был какой-то предмет обсуждения (что именно перемещаем), но на самом деле для сути разговора не играет роли что именно там перемещается, главное, что это декларируется контрактом класса.

Цитата Сообщение от Undisputed Посмотреть сообщение
Но я думаю, что это некорректное суждение.
Нет, ты не правильно понимаешь.

Еще раз: ты заявил, что семантика якобы различна. А она не различна, добавлен только еще один слой абстракции, который не меняет семантику. Выше я это доказал.

Добавлено через 12 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
это эквивалент
И вообще. Нехорошо так демагогию применять. Подмена тезиса тут.
Даже если мы сравниваем реализацию, допустим, но мы сравниваем ее семантику, а не сами сущности на эквивалентность. Кто сказал про семантику? Ты. Вот и весь диалог идет про семантику. Никто не пытается сказать, что std::thread и std::unique_ptr - это одно и то же. Не подменяй тезис и не пытайся выставить оппонента дурачком - некрасиво. Но то, что и классы в твоем примере point и clock - обладают одинаковой семантикой - семантикой копирования, и то, что std::thread и указатель\unique_ptr наделены семантикой перемещения и семантикой владения - факт.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 11:47
Цитата Сообщение от DrOffset Посмотреть сообщение
Я же с первого сообщения сказал, что ты пытаешься наделить семантикой перемещения объект, который и так ей обладает.
Не пытаюсь Потому что это не имеет смысла. Основная цель наличия указателя заключается в том, что бы обеспечить ленивую загрузку, но никак не наделить семантикой перемещения объект, который и так ей обладает.

Цитата Сообщение от DrOffset Посмотреть сообщение
Выше я это доказал.
То, что ты называешь доказательством, базируется на утверждении, что якобы я пытаюсь наделить семантикой перемещения объект который им уже обладает, однако я не пытаюсь этого сделать.

Как я понял, для тебя: ленивая загрузка == семантика перемещения. Однако в случае с ленивой загрузкой у нас один экземпляр std::thread, а в случае с семантикой перемещения у нас 2 экземпляра std::thread, и это, прошу заметить, ни разу не было опровергнуто Это именно то, о чем я говорю. Не более, не менее
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 11:56
Цитата Сообщение от Undisputed Посмотреть сообщение
Как я понял, для тебя: ленивая загрузка == семантика перемещения.
Ленивая загрузка реализована посредством семантики перемещения.
Кажется, что это то же самое, что ты предположил, но нет.

Цитата Сообщение от Undisputed Посмотреть сообщение
Однако в случае с ленивой загрузкой у нас один объект std::thread, а в случае с семантикой перемещения у нас 2 объекта std::thread, и это, прошу заметить, ни разу не было опровергнуто
Не понятно, зачем опровергать, что у нас два объекта std::thread? Это вообще не имеет отношения. Мы (ты) ведем речь про семантику.
Ты же выше просто сказал: "два объекта std::thread - или один - это семантическая сторона вопроса":
Цитата Сообщение от Undisputed Посмотреть сообщение
В данном случае я упомянул о семантической стороне вопроса. Один объект - один поток. Это думаю логичнее, чем два объекта - один поток.
Однако это не так. Два объекта или один - это как раз деталь реализации. А семантика - едина, о чем выше и были все мои сообщения.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 12:08
Цитата Сообщение от DrOffset Посмотреть сообщение
Ленивая загрузка реализована посредством семантики перемещения.
Если бы это было так, то в моем примере было бы 2 объекта std::thread. В упор не вижу, где я использую там семантику перемещения. Может она есть, но я не вижу. У меня там создание одного экземпляра std::thread, посредством динамической аллокации

Добавлено через 1 минуту
Важно: я спрашиваю про перемещение самого экземпляра std::thread
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 12:29
Undisputed,
До меня вдруг дошло, что ты просто не знаешь что такое семантика...
Может быть в этом и проблема. Семантика - это математический закон, который описывает некое поведение.
В общем прямо на школьном примере объясню.
Допустим у нас есть уравнение, описывающее семантику. Пусть это будет простое квадратное уравнение. Мы его можем решить (реализовать семантику) несколькими разными способами. Ты сейчас как будто утверждаешь, что семантика изменится, если способы решения этого уравнения будут различны, но это противоречит определению. Всякие подсчеты объектов и т.п. появляются именно тогда, когда мы реализуем (решаем уравнение) семантику. На саму семантику это решение не влияет. Т.е. при правильном решении - результат одинаковый.

Добавлено через 6 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Если бы это было так, то в моем примере было бы 2 объекта std::thread. В упор не вижу, где я использую там семантику перемещения. Может она есть, но я не вижу. У меня там создание одного экземпляра std::thread, посредством динамической аллокации
Важно: я спрашиваю про перемещение самого экземпляра std::thread
Да что ж такое -то
Семантика перемещения у тебя используется, чтобы передать владение динамическим объектом std::thread посредством указателя на него, вместе с этим указателем перемещается и владение самим потоком.

Добавлено через 9 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Если бы это было так, то в моем примере было бы 2 объекта std::thread.
Еще раз по-другому, у тебя в исходной задаче что является ресурсом (корнем уравнения)? Правильно, поток. Объект std::thread - это не ресурс (в этой модели, когда мы не используем динамическую память), объект std::thread может этот ресурс и потерять - через detach, т.е. нет поэтому сомнений, что ресурсом он владеет. Далее ты предлагаешь сделать сам std::thread дополнительно ресурсом, и передавать уже владение самим объектом std::thread. Изменится ли от этого, что ресурсом в исходной задаче был поток? Нет, не изменится. Изменится ли семантика исходного ресурса - нет, не изменится. Ты просто применил другой способ решения того же самого уравнения -> семантика осталась прежней.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 13:00
Цитата Сообщение от DrOffset Посмотреть сообщение
Может быть в этом и проблема. Семантика - это математический закон, который описывает некое поведение.
Справедливости ради стоит отметить, что семантика это не обязательно математический закон. Это многозначный термин, который не ограничивается математикой. Этот термин так же используется в лингвистике, который насколько я знаю, означает грамматическое отличие по смыслу слов/предложений. Слова/выражения могут пониматься людьми одинаково, однако в конкретном контексте одно из похожих/одинаковых слов/предложений могут быть более предпочтительными. Это то, что я вкладывал в понятие семантика. Если вернуться к началу, то если нужен поток и его можно представить одним объектом, то более правильно семантично будет представить его именно одним объектом, а не двумя, тремя, четыремя...

Если поставить игру слов в сторону, то мне так никто и не объяснил, почему то, что можно решить одним целевым экземпляром, лучше решать двумя экземплярами, добавив еще один вспомогательный.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.05.2023, 13:10
DrOffset, в посте:
std::thread - как запустить поток отложенно?
NEED-A-JOB, показал вариант win32 реализации структуры потока, которая содержит аж два поля - указатель и ид.. То есть сам по себе поток не атомарен. Я понимаю, что идея передавать потоки в другие потоки не самая плодотворная, но в принципе упорство Undisputed, можно оправдать. Оговорюсь, - я согласен именно с вами поскольку в основном, да, поток будет как Дункан М'Клауд. Один, то есть.
А вот если воспользоваться RVO? Я понимаю, что это зависит от реализации, но как пожелание? Может же быть так, что вот тут будет один объект - один поток:
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
#include <iostream>
#include <thread>
#include <utility>
 
template<typename R=void, typename ...Args>
std::thread make_n_launch_thread(const std::function<R(Args...)>& fn, Args&& ...args )
{
    return std::thread(fn, std::forward<Args&& ...>(args...)) ;
}
 
void foo(int i)
{
    for(;i;--i)
    std::cout<<i<<" \n";
}
 
int main()
{
         using Fn_t = std::function<void(int)>;
         const Fn_t &f=foo;
 
           std::thread thr1= make_n_launch_thread(f,20);
 
           const Fn_t &&lmbd=[](int a){for(;a;--a)std::cout<<"a= "<<a<<'\n';} ;
 
           std::thread thr2= make_n_launch_thread(lmbd,35);
 
           std::thread thr3= make_n_launch_thread(f,10);
 
            thr1.join();
            thr2.join();
            thr3.join();
 
    return 0;
}
?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.05.2023, 13:15
Цитата Сообщение от Undisputed Посмотреть сообщение
многозначный термин
погугли что такое термин, и зачем он нужен.

термин не может быть многозначным по определению понятия "термин".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.05.2023, 13:26
Цитата Сообщение от IGPIGP Посмотреть сообщение
const Fn_t &&lmbd
лишний амперсанд втиснул)
0
03.05.2023, 13:29

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
погугли что такое термин, и зачем он нужен.
Ты тоже хочешь поиграть в слова? :)

0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 13:35
Цитата Сообщение от Undisputed Посмотреть сообщение
мне так никто и не объяснил, почему то, что можно решить одним целевым экземпляром, лучше решать двумя экземплярами, добавив еще один вспомогательный.
Все уже было сказано. Если это не помогает, то я из темы ухожу
Оценочные "лучше", "хуже", "правильнее", "более" и т.п. по отношению к обсуждаемому вопросу тут применяешь только ты. Речь не об этом шла.

Цитата Сообщение от IGPIGP Посмотреть сообщение
DrOffset, в посте:
Можно реализовать как угодно, я лично не против любых вариантов (правда с RVO чем тогда будет отличаться от прямого создания объекта в месте запуска?).
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 13:48
Цитата Сообщение от DrOffset Посмотреть сообщение
Оценочные "лучше", "хуже", "правильнее", "более" и т.п. по отношению к обсуждаемому вопросу тут применяешь только ты.
Ну эти "оценочные" это как раз то, что лежит в основе практически всех моих постов. Не знаю, может мне следовало подбирать более точные слова, что бы яснее выразить свою позицию (хотя не считаю, что допустил грубые ошибки в отношении выбора слов, во всяком случае смысл того что я говорю думаю для всех должен быть понятным).
Цитата Сообщение от DrOffset Посмотреть сообщение
Если это не помогает, то я из темы ухожу
Я тоже думаю что не нужно углубляться в этот вопрос.

Благодарю каждого, кто уделил время этой теме
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2023, 13:48

Поток std::thread с шаблоном в классе
Доброго времени суток уважаемые! Уперся лбом в следующую проблему. При использовании параллельных потоков в основном потоке проблем...

Как убить std::thread?
К сожалению мне так и не удалось найти информацию о том, как корректно убить std::thread в случае необходимости. Как правило, предлагают...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void test(vector&lt;char&gt; data) { ...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

Boost::thread vs std::thread
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru