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

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

26.01.2016, 18:39. Показов 3426. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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