Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393

Нужно, чтобы функция f вызывалась, приостановя, то один, то другой поток

27.08.2019, 20:52. Показов 1252. Ответов 6
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Даже не знаю как сказать. Попробую объяснить, нужно чтобы через определенное время вы вызвалась функция.
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
 
void LUAHook(lua_State* L, lua_Debug* ar) {
 
    lua_yield(L, 0);
}; 
void LUAHook1(lua_State* L, lua_Debug* ar) {
    lua_yield(L, 0);
};
 
const char* LUA = R"(
function foo()
for i = 1, 3 do
print(" func foo \n")
end
end
 
function main() 
for i = 1, 3 do
print(" func main "..i.."\n")
 
if j == nil
then  j=0 f() end
end  end
)";
int f(lua_State* L, lua_State* L1) {
    lua_getglobal(L1, "foo");
    lua_sethook(L1, LUAHook1, LUA_MASKCOUNT, 10);
    lua_resume(L1, L, 0);
    return 0;
};
int main() {
    lua_State* L = luaL_newstate(); luaL_openlibs(L);
    lua_State* L1 = lua_newthread(L);
    checkerror(L, LUA);
    f(L, L1);
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 10);
    int ret;
    lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
    while (true) {
            ret = lua_resume(L, L1, 0);
        if (ret == 0) {// Успешно завершение функции.
            break;  }
    };
 
    //      cout << ret << endl;
    return 0;
};

Нужно, чтобы функция f вызывалась, приостановя́, то один, то другой поток. Помогите, пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2019, 20:52
Ответы с готовыми решениями:

Чтобы функция вызывалась только 1 раз
вот, у меня в коде присутствует вызов функции авторизации, надо сделать чтобы функция авторизации только 1 раз запускалась в начале.

Как сделать, чтобы по удержанию кнопки некоторое время вызывалась функция?
Здравствуйте. У меня такой вопрос: как сделать , чтобы по удержанию кнопки вызывалась другая функция (или метод, или вообще что-то...

Сделать однострочную textarea, чтобы при нажатии enter вызывалась javascript функция
Надо сделать textarea, чтобы у него была только одна строка и при нажатии enter вызывалась javascript функция.

6
 Аватар для Darkfor
11 / 7 / 4
Регистрация: 25.03.2019
Сообщений: 140
28.08.2019, 15:04
Вашу цель, с таким маленьким колличеством объяснений понять сложновато. Так и не понятно, что вам нужно. Но если вы не знаете как вообще можно приостановить поток, то вот так:

C++
1
2
3
4
5
6
7
#include <thread>
#include <chrono>
 
int main()
 {
     this_thread::sleep_for(chrono::milliseconds(время в миллисекундах)); 
 }
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
28.08.2019, 16:03  [ТС]
Darkfor, Спасибо большое за то, что обратили внимание. Постараюсь объяснить: эта функция приостанавливает поток через каждые 6 секунд

C++
1
2
3
4
void LUAHook(lua_State* L, lua_Debug* ar) {
    lua_yield(L, 0);
};
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);  // Добавить подсчет счетчика, который сработает после указания числа
я хочу добиться следующего вывода на экран. Ломаю голову как организовать многопоточность через по таймеру приостановление первого, потом второго потока, потом опять первого. Буду очень рад за идеи.
Так пробовал.
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
void LUAHook(lua_State* L, lua_Debug* ar) {
    lua_yield(L, 0);
};
 
const char* LUA = R"(
function foo()
print(" func foo \n")
end
 
function main()
for i = 1, 3 do
print(" func main "..i.."\n")
end  end
)";
int main() {
    lua_State* L = luaL_newstate(); luaL_openlibs(L);
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);  // Добавить подсчет счетчика, который сработает после указания числа
    checkerror(L, LUA);
    lua_State* L1 = lua_newthread(L);
    int ret;
    lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
 
    while (true) {
        if (ret = !0) {
            ret = lua_resume(L, L1, 0);
        };
 
        if (ret == LUA_YIELD) {
            lua_getglobal(L1, "foo");
            lua_pcall(L1, 0, 0, 0);
        }
        if (ret == 0) {// Успешно завершение функции.
            break;
        }
    };
 
    return 0;
};
Выводится 
func foo
 
 func main 1
 
 func foo
 
 func main 2
 
 func foo
 
 func main 3
Хочу как улучшить, сделать более удобным.
Вот пример.
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
76
77
78
79
80
81
82
83
 
int checkerror(lua_State* L, const char* file) {
    int status = luaL_loadfile(L, file);// проверка есть ли ошибки.
    try {
        if (luaL_dostring(L, file) == LUA_OK) {
            return 0;
        }
        else {
            string x = lua_tostring(L, -1);
            throw x;
            return 0;
        }
    }
    catch (string x) {
        cout << x << endl;
        return 0;
    }
    return 0;
};
void LUAHook(lua_State* L, lua_Debug* ar) {
    lua_yield(L, 0);
};
 
const char* LUA = R"(
function foo()
for i = 1, 6 do
print(" func foo "..i.."\n")
end  end
 
function main()
for i = 1, 9 do
print(" func main "..i.."\n")
end  end
)";
int main() {
    lua_State* L = luaL_newstate(); luaL_openlibs(L);
    lua_State* L1 = lua_newthread(L);
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);  // Добавить подсчет счетчика, который сработает после указания числа
    lua_sethook(L1, LUAHook, LUA_MASKCOUNT, 6); // Добавить подсчет счетчика, который сработает после указания числа
    checkerror(L, LUA);
    int ret;
    lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
 
    while (true) {
        if (ret = !0) {
            ret = lua_resume(L, L1, 0);
        };
 
        if (ret == LUA_YIELD ) {
            lua_getglobal(L1, "foo");
            ret = lua_resume(L1, L, 0);
        }
        if (ret == 0) {// Успешно завершение функции.
            break;
        }
    };
 
    return 0;
};
Выводится
func foo 1
 
 func main 1
 
 func main 2
 
 func foo 2
 
 func foo 3
 
 func main 3
 
 func foo 4
 
 func main 4
 
 func foo 5
 
 func main 5
 
 func foo 6
 
 func main 6
Задача сделать функцию, которая позволяла заменить это кусок кода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);  // Добавить подсчет счетчика, который сработает после указания числа
    lua_sethook(L1, LUAHook, LUA_MASKCOUNT, 6); // Добавить подсчет счетчика, который сработает после указания числа
    checkerror(L, LUA);
    int ret;
    lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
 
    while (true) {
        if (ret = !0) {
            ret = lua_resume(L, L1, 0);
        };
 
        if (ret == LUA_YIELD ) {
            lua_getglobal(L1, "foo");
            ret = lua_resume(L1, L, 0);
        }
        if (ret == 0) {// Успешно завершение функции.
            break;
        }
    };
0
 Аватар для Darkfor
11 / 7 / 4
Регистрация: 25.03.2019
Сообщений: 140
28.08.2019, 16:42
Введи в поиск в Youtube "робота с потоками с++" и открой урок 1 и 2 от simple code. Думаю он объяснит тебе лучше, чем я. К тому же мой компьютер почему-то не хочет подключать библиотеку <thread>, так что и проверить свои идеи я тоже не смогу. Ссылку по правилам форума дать не могу.
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
28.08.2019, 16:57  [ТС]
Darkfor, спасибо за ответ, его обожаю, дело в том что работаю api lua https://pastebin.com/8f9UH56W нужна многопоточность для lua плагина gta vc https://pastebin.com/VatypnLb тут не дело в потоке, в функцию, которая будет приостанавливать потоки lua поочередно. писал обо этом здесь как лучше реализовать многопоточность в lua api c++?
0
 Аватар для Darkfor
11 / 7 / 4
Регистрация: 25.03.2019
Сообщений: 140
28.08.2019, 17:13
Вот как все оказывается замудренно. Чтож, прошу прощения, но тут я бессилен(.
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
28.08.2019, 20:55  [ТС]
вот решил
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
int checkerror(lua_State* L, const char* file) {
    int status = luaL_loadfile(L, file);// проверка есть ли ошибки.
    try {
        if (luaL_dostring(L, file) == LUA_OK) {
            return 0;
        }
        else {
            string x = lua_tostring(L, -1);
            throw x;
            return 0;
        }
    }
    catch (string x) {
        cout << x << endl;
        return 0;
    }
    return 0;
};
void LUAHook(lua_State* L, lua_Debug* ar) {
    lua_yield(L, 0);
};
 
const char* LUA = R"(
function foo()
for i = 1, 6 do
print(" func foo "..i.."\n")
end  end
 
function main()
for i = 1, 9 do
print(" func main "..i.."\n")
end  end
)";
void m(lua_State* L, const char* func1, const char* func2) {
    lua_State* L1 = lua_newthread(L);
    lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);  // Добавить подсчет счетчика, который сработает после указания числа
    lua_sethook(L1, LUAHook, LUA_MASKCOUNT, 5); // Добавить подсчет счетчика, который сработает после указания числа
    int ret;    
    lua_getglobal(L, func1);// функция lua возобновляется с последней прерванной позиции.
    lua_resume(L, L1, 0);
 
    while (true) {
        if (ret = !0) {
            ret = lua_resume(L, L1, 0);
        };
 
        if (ret == LUA_YIELD ) {
            lua_getglobal(L1, func2);
            ret = lua_resume(L1, L, 0);
        }
        if (ret == 0) {// Успешно завершение функции.
            break;
        }
    };
 
};
int main() {
    lua_State* L = luaL_newstate(); luaL_openlibs(L);
    checkerror(L, LUA);
    lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
    lua_resume(L, NULL, 0);
    m(L,"main", "foo");
    return 0;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2019, 20:55
Помогаю со студенческими работами здесь

Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке
доброго времени суток. изначально была функция, которая выглядит примерно вот так: public MyModel ReturnList( int id ) { ...

Сделать так, чтобы при каждом изменении переменной pos вызывалась некоторая сторонняя функция
Нужно сделать так, чтобы при каждом изменении переменной pos вызывалась некоторая сторонняя функция (если быть точным, процедура прорисовки...

Не получается правильно записать указатель, чтобы в основную функцию main (в операторе printf) вызывалась функция podproga
Не получается правильно записать указатель, чтобы в основную функцию main (в операторе printf) вызывалась функция podproga. Компилятор...

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

Один поток стопорит другой
Программа работает с СОМ-портом посредством перекрываемых функций. Поток №1 ведет чтение из порта и складывает данные в буфер. По нажатию...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru