Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Указатель указателя или Наследовать

14.08.2020, 12:42. Показов 9206. Ответов 111
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здесь
я вот тоже подумала (про своих баранов) - если у меня 2 thread'a (gui и secondary) и в secondary задан классом (как здесь), в котором работает функция, которая отдаёт массив в класс, ход обработки массива методом этого (куда отдаёт) класса - отразить в gui хочется... !?!
вот передаю указатель на Form из класса gui в класс secondary worker thread... (как по примеру #222)
а дальше?..
указатель на указатель параметром в др класс передавать? (что-то не проходит)?
передаю банально:
C++
1
2
3
4
5
6
public:
    const Vector<Vector<String>> & m_vUrls;
    MyAppWindow* m_pw;
    
    // Constructor  
    loadV(const Vector<Vector<String>>& spisok, MyAppWindow* m_pw);
ну или **
как не пытаюсь передать указатель на указатель или тот же указатель на gui в др класс - выдаёт, что инициализация gui возможна только в первичном потоке...
- а ведь только передать хочу указатель на то, что уже было проинициализировано в первичном потоке... т.е. на сам gui
ИЛИ ???
может, мне лучше наследовать 2-й класс (loadV) от класса worker и в нём поле "принятый из gui указатель" сделать protected?
(чтобы не заморачиваться передачей указателя на gui и уж тем более транслированием в gui поток из класса, куда передаём массив после его сбора в классе worker - который во вторично потоке от gui)...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2020, 12:42
Ответы с готовыми решениями:

Сохранить адрес из указателя в другой указатель, а потом первый указатель удалить
Добрый день всем. Возмём простейший пример: #include &lt;iostream&gt; using namespace std; int main() { int* p1 = new...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

111
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
31.08.2020, 18:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JeyCi Посмотреть сообщение
например макросом коллбэка, как в примере GoshaM...
В общем случае нет. В приведённом примере у GoshaM это именно прямые вызовы, пусть и разложенные в разные потоки. А события - это записи в очередях событий, которые в Qt записываются при обработке сигналов и считываются при выполнении метода exec() соответствующего объекта (в соответствующем ему потоке).

Добавлено через 7 минут
Опять же, в случае Qt мьютексы автоматически ставятся на разграничение записи и чтения из очереди (иначе возможна "гонка" между потоками, с недозаписыванием/недосчитыванием элемента).
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
31.08.2020, 20:49  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
В приведённом примере у GoshaM это именно прямые вызовы
здесь? -это как раз в U++ макрос для коллбэка...
вы, наверно, имели ввиду этот его вариант
Цитата Сообщение от TRam_ Посмотреть сообщение
Опять же, в случае Qt мьютексы автоматически ставятся на разграничение записи и чтения из очереди
ну там как бы м компилятор вроде другой -
В библиотеке Qt Метаобъектный компилятор
- делает сам часть работы для реализации паттерна Наблюдатель, реализованного для сигнально-слотовой системы...
Цитата Сообщение от TRam_ Посмотреть сообщение
(иначе возможна "гонка" между потоками, с недозаписыванием/недосчитыванием элемента).
вот и говорю, синхронизация нужна, видимо... в U++ ... тоже думаю, что мьютексами надо обеспечить её (что-то зону видимости volatile Atomic Stopped не могу настроить для передачи из gui в метод класса, объект которого запускается во вторичном потоке -- намутила уже тут -- в класс залезла со своим gui -- а вылезти не могу пока )...
а то как-то ни передача ссылки, ни захват контекста - не дают адекватной обратной связи (от gui к потоку)...
надо пробовать, как здесь , наверно??...
потому что, если послать ещё можно попробовать Event'ом U++... но отловить во вторичном потоке смену флага isInterruptionRequested (да даже не в потоковой функции, а в классе, чей объект работает в этой потоковой функции) - как-то пока ...
вот и интересуюсь - а как там по стандарту - синхронизировать? или лямбдой можно справиться? (захватывая контекст)...
всё равно путь от gui до member-method'а класса через вторичный поток -- ой какой-то далёкий
вот и изложила свои сомнения...

Добавлено через 8 минут
наверно, действительно, пока объект крутит в себе свой метод - залезть туда с переменной из другого потока не так-то легко - тут уж очередь event'ов (в отличие от gui) отсутствует...

Добавлено через 2 минуты
хотя event в U++ - это обычный коллбэк...
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.09.2020, 10:20  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
синхронизировать?
я, наверно, погорячилась...
хотя и это тоже надо в жизни...
а ведь с сокетами всё должно быть проще ... закрываем и объект сам вернёт error на вызывающую сторону... которую просто обработать и return из потоковой функции, даже Thread::Shutdown не надо делать экстренно по кнопке с bStopped... и уж тем более передавать этот bStopped...
p.s.
хотя, конечно, если сокет открыт во вторичном потоке - то, может, и надо туда постучать из gui под мьютексом??.. но что-то мне кажется, что сокет из любого потока виден без мьютексов... просто убить/закрыть его... имхо... чего уж тут что-то локировать для передачи message'ей или дёргать volatile Atomic bStopped...
p.p.s.
и с коллбэками - как возможностью независимого исполнения кода - действительно, становится не страшно, когда смотришь на лямбду, как положено, - т.е. как на анонимную функцию...
Vector<Event<>> cb; - тоже удобно в U++
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.09.2020, 11:27  [ТС]
Цитата Сообщение от GoshaM Посмотреть сообщение
Worker ничего не знает о GUI:
однако...
According to OOP paradigm, each class must have everything possible within it. It must be it`s own model, view and controller (MVC) - in one place.
- тоже имеет смысл в более узком контексте!...

Добавлено через 2 минуты
и с удобным Фреймворком - и того не надо... just use objects!
это я к тому, что Декомпозиция нужна - только если, действительно, упрощает either чтение кода or его сопровождение...
=============================
Добавлено через 1 час 34 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
?? а в U++ если кнопкой запускаем Event в btnStopped смены флага isInterruptionRequested - как правильно по уму отловить в потоке?
знакомо:
Цитата Сообщение от JeyCi Посмотреть сообщение
deadlock
Боремся с deadlock-ами
Ctrl::Call
- чувствовала я, что &ConditionVariable надо как-то впаять... а он то уже есть...

Добавлено через 2 часа 43 минуты
ИТОГО:
Цитата Сообщение от JeyCi Посмотреть сообщение
-- в класс залезла со своим gui -- а вылезти не могу пока )...
а просто не надо с кнопки в вызываемом из вторичного потока member-method'e делать ShutdownThreads(); ...
а там надо обработать нажатие кнопки stop, вернуть false в вызывающий поток, завершить в нём функцию... и, наверно, отправить в detach ...
по ходу отловить его при новом старте, вероятно, через тот же ConditionVariable... т.к. в любом случае новое создание/уничтожение потока - дорого стОит...
p.s.
только , вероятно, где-то потеряла какой-то pointer или reference... т.к. error на Destructor'e главного окна предупреждает о том, что "возникшая проблема привела к прекращению работы программы. закройте эту программу"
опять чьё-то "время жизни", наверно
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.09.2020, 14:00
Цитата Сообщение от JeyCi Посмотреть сообщение
и, наверно, отправить в detach
Не надо.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.09.2020, 16:31  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не надо.
но вы вроде сами советовали - усыпить, потом разбудить (когда надо опять его использованть)... пока не нашла как?..
насчёт detach - верю - экстремально... (но менее экстремально, чем убить сокет ... просто http.Abort() достаточно)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.09.2020, 16:59
Цитата Сообщение от JeyCi Посмотреть сообщение
но вы вроде сами советовали
Вы, пожалуйста, не мешайте в кучу все, что я говорил.
detach - не надо делать.

Добавлено через 46 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
пока не нашла как?..
на condition_variable, например, он может уснуть.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.09.2020, 19:50  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
не мешайте в кучу все, что я говорил.
detach - не надо делать.
значит не вы, а один из линков по вашему совету
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//В качестве примера я приведу код, который имитирует join для отвязанного(detached) потока:
 
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::condition_variable g_Condition;
std::mutex g_Mutex;
 
int main()
{
    auto call = []()
    {
        std::unique_lock<std::mutex> lock(g_Mutex);
        std::this_thread::sleep_for(std::chrono::seconds(5));
        std::notify_all_at_thread_exit(g_Condition, std::move(lock));
    };   
    std::thread callThread(call);
    callThread.detach();
    std::unique_lock<std::mutex> lock(g_Mutex);
    g_Condition.wait(lock);
    return 0;
}

давайте не будем придираться к словам...
ссылку на совет "не удалять поток, а усыплять его и будить при необходимости" не оставлю - искать надо...
НО чтобы будить - надо ведь, наверно, чтобы условно listener, спящий, - слушал сигнал, который даст разрешение проснуться... т.е. каждые, например sleep(250) - false awakening у него, чтобы были... типа того, полагаю... ну да ладно - дочитаю у Вильямса - когда дойду до практики...
p.s.
но о вашем совете - ещё, конечно же, подумаю... спасибо
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.09.2020, 21:34
Цитата Сообщение от JeyCi Посмотреть сообщение
значит не вы, а один из линков по вашему совету
Ну так вы прочитайте к чему там он используется по-внимательнее.

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
НО чтобы будить - надо ведь, наверно, чтобы условно listener, спящий, - слушал сигнал, который даст разрешение проснуться
condition variable как раз для этого и нужен.

Добавлено через 5 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
давайте не будем придираться к словам...
Это не придирки к словам, а попытка пресечь неверную интерпретацию моих слов или приписывание мне того, чего я не говорил.
Это худшее, что может произойти.
В общем и целом посыл такой: я не понимаю при чем тут усыпление потока к моим словам про detach. В общем случае это ортогональные вещи. Поэтому возражения "но вы сами советовали..." мне не понятны.

Пример из блога - иллюстрация, которая показывает эмуляцию join. Это не значит, что при любом использовании condition variable обязательно нужен detach. Это ниоткуда не следует и ни автором блога, ни мной в виду не имелось.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.09.2020, 08:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не значит, что при любом использовании condition variable обязательно нужен detach. Это ниоткуда не следует и ни автором блога, ни мной в виду не имелось.
мной тем более!
Цитата Сообщение от DrOffset Посмотреть сообщение
пресечь неверную интерпретацию моих слов или приписывание мне того, чего я не говорил.
и мне того же...
===
Цитата Сообщение от DrOffset Посмотреть сообщение
при чем тут усыпление потока к моим словам про detach.
не при чём...
1) просто detach, возможно тоже можно вернуть (по коду, пример которого приложила) - ещё не тестила этот подход...
2) про detach обсуждали - его бессмысленность сомнительна для меня пока - иногда можно себе и позволить (если разрабатываемый app ещё не претендует на супер-сложность)...
3) про усыпление - отдельная история - но если detach можно отловить cv-ом, то почему бы и не дать ему погулять или там же поспать (в отвязке)?... погулять, конечно, плохо - туда можно вклинить чужой (даже хакерский) код, наверно...
[хотя реализация так себе, имхо, 1 поток можно и создать и join - и норм. недолго, уже если много - то стоит подумать о времени =>thread-pool'е]
p.s.
но всё-таки моменты неблокирующей реализации потоков - основной смысл интереса к этой теме - чтобы много асинхронного кода не давало по факту синхронного исполнения -
хочу добиться и, действительной асинхронности и скорости и недорогого возврата результатов в основной рабочий поток - для дальнейшей обработки... и идеи пока есть!
Цитата Сообщение от DrOffset Посмотреть сообщение
Не надо.
но ведь голословно.... без аргументов....

Добавлено через 4 минуты
аргумент был лишь в прошлой ветке от oleg-m1973 - о limit in Windows ~500...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.09.2020, 11:19
Цитата Сообщение от JeyCi Посмотреть сообщение
но ведь голословно.... без аргументов....
Имею право. Посмотрите сколько уже лет я на форуме отвечаю.
Все уже отвечено по нескольку десятков раз. Поищите.

Вот
Thread на стеке
или вот Создание потока для вызова метода класса

Добавлено через 8 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
но если detach можно отловить cv-ом
Не ясно зачем это делать, если join делает тоже самое.

Цитата Сообщение от JeyCi Посмотреть сообщение
если разрабатываемый app ещё не претендует на супер-сложность)
Вот именно потому, что у вас не "супер-сложный app", detach вам и не нужен.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.09.2020, 13:58  [ТС]
... коль ветка начинает скатываться к обсуждению субъективных прав... напомню лишь, что суть проблемы была в организации communication в рамках с учётом нескольких потоков и силами U++... и линки по ветке - были ответами на возможности both по-быстрому & по-правильному по науке...
разбивка на классы добавляет сложностей в этом взаимодействии M и V... но и определяет пути для рефакторинга... остальное - дело вкуса... и сложности потребностей...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.09.2020, 14:01
Цитата Сообщение от JeyCi Посмотреть сообщение
по-правильному по науке...
Вот именно, что использование detach обычно выдает поверхностный подход к управлению контекстом потока. По крайней мере в примерах людей в этом разделе форума. Если я вам говорю, что этого делать не нужно, то по крайней мере это повод поискать материал.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.09.2020, 14:32  [ТС]
Дипломатия - превыше всего
Цитата Сообщение от volovzi Посмотреть сообщение
если программировать правильно, то получатся паттерны, а если программировать паттернами, то не факт, что получится правильно.
Тебе сейчас надо не паттерны изучать, а алгоритмы.
Добавлено через 52 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
подход к управлению контекстом потока
вот за это - спасибо... я всё контексты не научусь примерять... помозгую ещё... тут у меня просто ещё и классы наворачиваются... не говорила ведь, что всё легко... просто всё пошагово поэтапно... а гонять results и btnStopped всё равно надо будет в 2х направлениях - одно туда, другое сюда...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.09.2020, 14:33
JeyCi, где ж тут паттерны? Выше даны ссылки на объяснение в процессе дискуссии чем чревато использование detach в неподготовленном окружении. Все показано, рассказано.

И что такого произошло недипломатичного? Я мог бы у вас попросить того же, потому что выше я просто озвучил свою позицию. За столько лет на форуме не всегда нужно повторять что-то еще раз. Это занимает много времени, а кто мне его вернет? Поэтому если я что-то и заявляю изначально "бездоказательно", то только лишь в расчете на вопрос "почему". Обратите внимание, что как только вы его задали, я выдал вам ссылки.

Не нужно эмоционально реагировать. В моих постах нет эмоций, только расчёт. Если вы прочитаете их спокойным тоном, без приписывания мне агрессии - это станет понятно.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.09.2020, 15:01  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
И что такого произошло недипломатичного?
обсуждение ваших прав... и ваш субъективизм о кажущихся вам эмоциях...
Цитата Сообщение от DrOffset Посмотреть сообщение
Это занимает много времени, а кто мне его вернет?
Дипломатия - это разговор по теме, а не попытки спорами, правами и безапеляционностью вызвать меня на доказывание относительности моих реакций относительно моих задач... спасибо за ваш ответ вы получили от меня ещё там... ваш интерес к моему субъективизму за рамками темы - уж точно не правомерен даже в рамках ваших прав... offtop всё-таки...
Цитата Сообщение от DrOffset Посмотреть сообщение
В моих постах нет эмоций, только расчёт.
если есть, что добавить по взаимодействию M и V без сигналов-слотов (и между потоками и между классами) -- тоже с интересом приму к сведению, как и все ваши советы... но подробностей всего тз - снова не предоставлю... offtop всё-таки...
в принципе варианты, как и ваш view уже вроде все озвучены...
и ваш совет из прошлой ветки:
уметь выделять главное
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.09.2020, 15:18
Цитата Сообщение от JeyCi Посмотреть сообщение
ваш интерес к моему субъективизму за рамками темы - уж точно не правомерен даже в рамках ваших прав...
Мне не интересно, чтобы в теме появился конфликт. Поэтому я объясняю все свои поступки и слова. Больше никаких целей не преследовали посты выше.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.09.2020, 16:04  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
подход к управлению контекстом потока.
если, например, я захватываю в коллбэк ссылку на window (где кнопки и их методы) и ссылку на worker'a (где bool Stopped и запуск рабочего потока) -- то вот тут как раз с кнопки изменить boolStopped и не могу, если worker стартует с указателем на windows => туду всё выбросить может, а window's кнопка stop не может изменить состояние флага bStopped (потому что этот флаг- это поле worker'a)...
значит => чтобы иметь и обратную связь - мне надо также захватывать в окно и ссылку на worker'a... как и в worker'a я захватила ссылку на windows...
(как GoshaM показывал)
- ну в принципе работа над ошибками понятна по этой части...
НО помимо захвата в коллбэк... надо потом ещё захватить в новый thread, открываемый этим коллбэком, кнопку btnStopped... пока понимаю так

Добавлено через 3 минуты
т.е. 1-й захват (в worker_Class) с коллбэка, продолжить 2-ым захватом (в start_work методе того worker_class'a строкой кода thr.Run([m_pw->btnStopped]{}))... чтобы потом нормально принимать btnStopped сигналы... имхо
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
04.09.2020, 17:53  [ТС]
вышла из deadlock'a , закрыла поток... на том, что было... альтернативные варианты архитектуры ещё покручу
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
06.09.2020, 18:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
detach - не надо делать.
использование detach обычно выдает поверхностный подход к управлению контекстом потока.
вот такой ответ п.8 меня достаточно убеждает:
On the other hand, if we do not call join() after creating a thread in the above case, the main function will not wait for the spawned thread to complete before it tears down the application. If the application tears down before the spawned thread finishes, it will terminate the spawned thread as well, even if it has not finished executing. This can leave data in a very inconsistent state and should be avoided at all cost.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2020, 18:40

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

Разыменование указателя на указатель
в функцию передается указатель на указатель класса, что бы получить доступ к методам класса нужно разименовать указатель так ? MyClass...

Инкремент указателя на указатель
Добрый день!!! Ребят, подскажите пожалуста, как выполнить инкремент указателя на указатель. Программа аварийно завершается. Я так понимаю,...

Передача указателя на указатель в функцию
Вопрос к знатокам: Есть абстрактный класс(Symbol) и его производный (Cross). Создаю указатель этого абстрактного класса(Symbol *first) ,...

Передача в функцию указателя на указатель
Добавление нового элемента в начало списка: void Add_Beg(List **u, Data &amp;x) // Почему в 1 аргументе функции указатель на указатель? { ...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru