Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83

Работа с функциями из потоков (Thread)

26.01.2016, 18:39. Показов 3455. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
В программу добавлено 2 дополнительных потока(TThread).
C++
1
2
3
4
5
6
7
8
9
MyThread **Thr = new MyThread*[2]; 
for(int i = 0; i < 2; i++)
{
    Thr[i] = new MyThread(true);
    Thr[i]->Priority = tpHigher;
    Thr[i]->FreeOnTerminate = true;
    Thr[i]->Start();
    Application->ProcessMessages();
}
Оба этих потока выполняют однотипную работу - переводят в транслит список строк(у каждого потока свой список).

Функция транслита(объявлена в Unit2.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
String Translate(String text)
{
    String ret;
    String rus[75]=
    {
        "А", "а", "Б", "б", "В", "в", "Г", "г", "Ґ", "ґ", "Д", "д", "Е", "е", "Є", "є", "Ж",
        "ж", "З", "з", "И", "и", "І", "і", "Ї", "ї", "Й", "й", "К", "к","Л", "л", "М", "м",
        "Н", "н", "О", "о", "П", "п", "Р", "р", "С", "с", "Т", "т", "У", "у", "Ф", "ф",
        "Х", "х", "Ц", "ц", "Ч", "ч", "Ш", "ш", "Щ", "щ", "Ь", "ь", "Ю", "ю", "Я", "я", "Ы",
        "ы", "Ъ", "ъ", "Ё", "ё", "Э", "э", " "
    };
 
    String eng[75]=
    {
        "A", "a", "B", "b", "V", "v", "G", "g", "G", "g", "D", "d", "E", "e", "E", "e", "Zh",
        "zh", "Z", "z", "I", "i", "I", "i", "Yi", "yi", "J", "j", "K", "k", "L", "l", "M",
        "m", "N", "n", "O", "o", "P", "p", "R", "r", "S", "s", "T", "t", "U", "u", "F", "f",
        "H", "h", "C", "c", "Ch", "ch", "Sh", "sh", "Shh", "shh", "", "", "Ju", "ju","Ja",
        "ja", "Y", "y", "", "", "Jo", "jo", "Je", "je", "_"
    };
    bool find=false;
    for(unsigned int i = 1; i <= text.Length(); i++)
    {
        find=false;
        for(int j = 0; j < 75; j++)
        {
            if( text.SubString(i,1).Compare(rus[j].c_str()) == 0 )
            {
                ret += eng[j].c_str();
                find=true;
                break;
            }
        }
        if( !find ) ret += text.SubString(i, 1);
    }
    text = "";
    return ret.c_str();
}
Так вот, как только дело доходит до использования этой функции появляется следующая ошибка:
Code
1
Out of memory
В строке:
C++
1
if( text.SubString(i,1).Compare(rus[j].c_str()) == 0 )
Скажите, пожалуйста, из-за чего появляется ошибка такого рода. И как правильно использовать данную функцию в потоке.
Спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.01.2016, 18:39
Ответы с готовыми решениями:

Массив потоков <thread>
Последний раз потоки писал на C под Linux. И там прокатывала такая штука thread a; for(int i=0;i&lt;n;i++) a_create(тряляля); ...

Увеличить возможное количество потоков (thread'ов)
Привет! Не могу решить проблему - создаю в программе большое кол-во потоков, при создании 345-го потока pthread_create() возвращает...

Создание потоков Thread через цикл
Вот полный код программы,где через t задается условное количество выполнений циклов, которые погружают поток в сон, тоесть если я задам...

11
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.01.2016, 12:12
0. Вне потока эта функция нормально работаете?
1. Избавьтесь от магических чисел типа "75".
2. Вероятно что бы ускорить поиск стоит использовать к примеру std::map, где то на форуме была такая реализация транслитерации.
3.
C++
1
text.SubString(i,1).Compare(rus[j].c_str()) == 0
Что это вообще?
Нафига SubString если есть обращение по индексу?
Зачем c_str() ?
1
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83
27.01.2016, 19:36  [ТС]
Avazart,
0. Да, функция работает хорошо.
1. Это как раз и делаю, но как-то безуспешно.
Появляется ошибка при объявлении массива
Code
1
E2141 Declaration syntax error
в потоке
C++
1
map<String, String> trans;
Как объявить этот ассоциативный массив в Unit'е потока?

Вот, нашел я ту самую тему.

Из Unit1 функция(новая) транслита работает хорошо.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.01.2016, 15:23
Цитата Сообщение от HelloWold Посмотреть сообщение
1. Это как раз и делаю, но как-то безуспешно.
C++
1
2
const int rus_size= 75;
String rus[rus_size]= { /* ... */ }
Добавлено через 55 секунд
Цитата Сообщение от HelloWold Посмотреть сообщение
Как объявить этот ассоциативный массив в Unit'е потока?
А в чем проблема?
Членом класса или локально...
1
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83
29.01.2016, 21:37  [ТС]
Avazart, я переписал свою функцию:
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
const int rus_count = 75;
const int eng_count = 75;
 
String Translate(String text)
{
    char rus[rus_count] =
    {
        'А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Ґ', 'ґ', 'Д', 'д', 'Е', 'е', 'Є', 'є', 'Ж',
        'ж', 'З', 'з', 'И', 'и', 'І', 'і', 'Ї', 'ї', 'Й', 'й', 'К', 'к','Л', 'л', 'М', 'м',
        'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у', 'Ф', 'ф',
        'Х', 'х', 'Ц', 'ц', 'Ч', 'ч', 'Ш', 'ш', 'Щ', 'щ', 'Ь', 'ь', 'Ю', 'ю', 'Я', 'я', 'Ы',
        'ы', 'Ъ', 'ъ', 'Ё', 'ё', 'Э', 'э', ' '
    };
 
    String eng[eng_count] =
    {
        "A", "a", "B", "b", "V", "v", "G", "g", "G", "g", "D", "d", "E", "e", "E", "e", "Zh",
        "zh", "Z", "z", "I", "i", "I", "i", "Yi", "yi", "J", "j", "K", "k", "L", "l", "M",
        "m", "N", "n", "O", "o", "P", "p", "R", "r", "S", "s", "T", "t", "U", "u", "F", "f",
        "H", "h", "C", "c", "Ch", "ch", "Sh", "sh", "Shh", "shh", "", "", "Ju", "ju", "Ja",
        "ja", "Y", "y", "", "", "Jo", "jo", "Je", "je", "_"
    };
    String ret("");
    bool find(false);
    for(int i = 1; i <= text.Length(); i++)
    {
        find = false;
        for(int j = 0; j < rus_count; j++)
        {
            //if( text.SubString(i,1).Compare(rus[j].c_str()) == 0 )
            if(text[i] == rus[j])
            {
                ret += eng[j];
                find = true;
                break;
            }
        }
        if(find == false)
        {
            ret += text[i];
        }
    }
    text = "";
    return ret;
}
И что-то не совсем понимаю, почему это условие:
C++
1
2
3
4
5
6
if(text[i] == rus[j])
{
    ret += eng[j];
    find = true;
    break;
}
срабатывает только на пробел(заменяет его на _). На буквы не обращает внимания.
Нуждаюсь в Вашей подсказке.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2016, 21:50
Какая версия билдера?
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83
29.01.2016, 23:53  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Какая версия билдера?
XE8. У Вас данный код работает?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.01.2016, 01:21
Ну тогда не
C++
1
char rus[rus_count] =
А
C++
1
2
3
4
wchar_t rus[rus_count] =
{
   L'А', L'а' 
   // ...
1
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83
31.01.2016, 17:15  [ТС]
Хм...Ошибка так и появляется.
Вопрос : функция Translate нужно использовать через критические секции?
Миниатюры
Работа с функциями из потоков (Thread)   Работа с функциями из потоков (Thread)  
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.01.2016, 17:30
Цитата Сообщение от HelloWold Посмотреть сообщение
Вопрос : функция Translate нужно использовать через критические секции?
Это как?

Добавлено через 4 минуты
У тебя явно пишет, не хватает памяти.

Добавлено через 1 минуту
Попробуй вывести за пределы функции массивы rus и en т.е определи их глобально.
0
0 / 0 / 0
Регистрация: 09.02.2015
Сообщений: 83
01.02.2016, 14:13  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Это как?
Помимо координации работы потоков с помощью приоритетов потоков в приложении также часто бывает необходимым синхронизировать потоки. Что имеется ввиду ?
Координация совместной работы нескольких потоков, если например они пытаются одновременно что-то сделать,
например вывести что-либо на форму, получить доступ к глобальным данным и т.д.
Вот я и подумал, что каждую объявленную мной функцию нужно использовать через критические секции
C++
1
2
3
EnterCriticalSection(&Form1->CS);
...
LeaveCriticalSection(&Form1->CS);
Но это, как я понял, делать не обязательно. Можете объяснить почему( в интернете ответа не нашел ).


Насчет программы : перенес код в новый(чистый) проект. Все работает. Что это за фокусы-покусы?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.02.2016, 14:46
Лучший ответ Сообщение было отмечено HelloWold как решение

Решение

"Охранять" нужно разделяемые ресурсы между потоками.

Реентерабельность

Добавлено через 4 минуты
Рихтер. ГЛАВА 8 Синхронизация потоков в пользовательском режиме

Добавлено через 26 минут
Те данные что используются только в одном потоке, не нуждаются в "охране".
А реентерабельные функции сами по себе из определения работают единолично со своими данными(делают копии аргументов, не используют статические и глобальные разделяемые переменные)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2016, 14:46
Помогаю со студенческими работами здесь

Класс Thread, потоки синхронизация потоков и т.д
Имеется код: Модуль Unit1.cpp (в нем запускается поток) //------------------------------------------------------ //... ...

Синхронизация потоков, thread-safe usleep
Постановка задачи: Создать 2N+1 потоков. N потоков пишут в общий буфер (далее ОБ), N + 1 потоков читают из ОБ и печатают прочитанное....

Thread разбить программу в несколько потоков
Всем привет! Народ, такая проблема, написала программу, теперь нужно её разбить на несколько потоков. Но вот беда, не умею пользоваться...

Сложение результата работы двух потоков. std::thread
Здравствуйте, есть два потока, std::thread thr(Sum,B,Z,std::ref(sum)),std::thread thr1(Sum, C, Z, std::ref(sum)), которые используют одну и...

Возможно ли для двух потоков (thread) создать 1 переменную?
Подскажите, возможно ли создать 1 переменную для двух потоков, что бы при изменении ее в первом потоке она изменялась в другом? ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru