Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23

Работа со статическими и локальными переменными в классе

29.09.2016, 16:47. Показов 1463. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
такая проблема: пишу программу под MFC. Работа заключается в принятии посылке строки в COM-порт, затем принимает ответ и разбирает принятую строку. Сделал через потоки, все посылает и принимает, все отлично. Проблема заключается в разборе строки. Сама функция написана, я использую ее в функции потока чтения байт из COM-порта. И эта функция чтения статическая, а функция разбора нестатическая(в моем случае можно и разбор строки сделать статической, но тогда много других переменных тоже придется делать статическими... в общем не очень вариант). Соответственно я не могу ее использовать в статической функции. Подскажите, кто знает как реализовать функцию разбора строки, может через статическую переменную, какую-нибудь, но тогда нужно что-бы какая-то функция постоянно проверяла эту переменную, я не догоняю как это сделать. Заранее спасибо.

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
DWORD WINAPI CWoodFon12Dlg::ReadThread(LPVOID lpParam)
{
    
                        ReadFile(m_hCom, bufrd, btr, &temp, &overlapped);     
                        counter++;
                        
 
                        for (i = 0; i < btr; i++)
                        {
                                    
                                                                            ...ЧАСТЬ кода убрано, оно тут  ни к чему
                                    else if (step == 5)
                                    {
                                        pars_str[count] = bufrd[i];
 
                                        if (pars_str[count] == '\n')
                                        {
                                            pars_str[++count] = NULL;
                            // ТУТ должна быть функция разбора строки parsing_message(count, pars_str)
                                            step = 0;
                                            count = 0;
                                            
                                        }
                                        else count++;
                                    }
                                        
                        }
                        
                    }
 
            }
        }
    }
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2016, 16:47
Ответы с готовыми решениями:

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

Проблема со статическими переменными в рекурсии
Собственно, преподаватель требует, чтобы была одна входная переменная А и точность (10^-6) Функцию написал, но при другом А, счетчик...

Помогите разобраться со статическими переменными в Java
Hi, java programmer! Я пытаюсь создать и показать окно. Текст программы такой: import javax.swing.*; public class JFrameDemo { ...

9
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
29.09.2016, 17:03
Типа того. Разбирайтесь и напишите.
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
class CWoodFon12Dlg
{
private:
       static CWoodFon12Dlg* m_pThis;
 
public:
       CWoodFon12Dlg() { m_pThis = this; };
       DWORD WINAPI ReadThread(LPVOID lpParam);
public:
       static char*& parsing_message(int count, char* pars_str);
}
 
CWoodFon12Dlg* CWoodFon12Dlg::m_pThis = NULL;
 
DWORD WINAPI CWoodFon12Dlg::ReadThread(LPVOID lpParam)
{
    
                        ReadFile(m_hCom, bufrd, btr, &temp, &overlapped);     
                        counter++;
                        
 
                        for (i = 0; i < btr; i++)
                        {
                                    
                                                                            ...ЧАСТЬ кода убрано, оно тут  ни к чему
                                    else if (step == 5)
                                    {
                                        pars_str[count] = bufrd[i];
 
                                        if (pars_str[count] == '\n')
                                        {
                                            pars_str[++count] = NULL;
                                            m_pThis->parsing_message(count, pars_str);
                                            step = 0;
                                            count = 0;
                                            
                                        }
                                        else count++;
                                    }
                                        
                        }
                        
                    }
 
            }
        }
    }
    return 0;
}
1
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23
29.09.2016, 17:36  [ТС]
В принципе все понятно, но тут функция parsing_message создается статической. Есть ли способ вызвать ее каким-то образом, что бы она была нестаической?(я не сказал, parsing_message ничего не возвращает(void))
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.09.2016, 18:25
Лучший ответ Сообщение было отмечено RazDva1212 как решение

Решение

RazDva1212, все не так. Нужно использовать lpParam для передачи указателя на экземпляр. И через него соответственно уже вызывать функции класса. Т.е. статическая у тебя должна быть только функция потока. При создании потока в lpParam нужно будет передать this. Схема стандартная для таких случаев.
Можешь поискать по форуму, примеров, в том числе моих, было уже полно написано.
0
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23
29.09.2016, 23:45  [ТС]
Спасибо большое, разобрался
0
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23
23.11.2016, 19:36  [ТС]
DrOffset, Не могу до конца понять. Получается m_pThis = NULL. (m_pThis = (CWoodFon12Dlg*)lpParam; ). И соответственно программа не работает .


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
class CWoodFon12Dlg : public CDialogEx
{
    // Создание
public:
 
    CWoodFon12Dlg(CWnd* pParent = NULL);
static CWoodFon12Dlg* m_pThis;
static DWORD WINAPI ReadThread(LPVOID lpParam);
}
 
CWoodFon12Dlg* CWoodFon12Dlg::m_pThis = NULL;
 
CWoodFon12Dlg::CWoodFon12Dlg(CWnd* pParent /*=NULL*/)
{
m_pThis = this;
}
 
DWORD WINAPI CWoodFon12Dlg::WriteThread(LPVOID lpParam)
{
    m_pThis = (CWoodFon12Dlg*)lpParam;
    DWORD temp, signal; //temp - переменная-заглушка
    overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);        
    while (1)
    {
        WriteFile(m_pThis->m_hCom, bufwr, strlen(bufwr), &temp, &overlappedwr);
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
23.11.2016, 19:48
RazDva1212, где код, который запускает поток?

Добавлено через 35 секунд
Выше я писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
При создании потока в lpParam нужно будет передать this.
Скорее всего это не было сделано.

Добавлено через 8 минут
Схема примерно такая (показываю на твоем коде)
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
class CWoodFon12Dlg : public CDialogEx
{
    // Создание
public:
    CWoodFon12Dlg(CWnd* pParent = NULL);
 
    void startThread();
 
/*static CWoodFon12Dlg* m_pThis;*/ // не нужно
    static DWORD WINAPI WriteThread(LPVOID lpParam);
}
 
/*CWoodFon12Dlg* CWoodFon12Dlg::m_pThis = NULL;*/ // не нужно
 
CWoodFon12Dlg::CWoodFon12Dlg(CWnd* pParent /*=NULL*/)
{
/*m_pThis = this;*/ // Не нужно
}
 
void CWoodFon12Dlg::startThread()
{
    CreateThread(NULL, 0, &WriteThread, (void*)this, 0, NULL); // передается this
}
 
DWORD WINAPI CWoodFon12Dlg::WriteThread(LPVOID lpParam)
{
    CWoodFon12Dlg * pThis = (CWoodFon12Dlg*)lpParam;
    DWORD temp, signal; //temp - переменная-заглушка
    overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);
    while (1)
    {
        WriteFile(pThis->m_hCom, bufwr, strlen(bufwr), &temp, &overlappedwr);
    //.............    
}
1
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23
23.11.2016, 21:41  [ТС]
DrOffset, Теперь запускает поток. Но когда приостанавливает его, то исключение происходит.


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
class CWoodFon12Dlg : public CDialogEx
{
    // Создание
public:
    CWoodFon12Dlg(CWnd* pParent = NULL);
 
   
 
    static DWORD WINAPI WriteThread(LPVOID lpParam);
}
 
 
 
 
bool CWoodFon12Dlg::InitCom()
{
//writer = CreateThread(NULL, 0, &WriteThread, NULL, CREATE_SUSPENDED, NULL); // Было так.
    writer = CreateThread(NULL, 0, WriteThread, (void*) this, CREATE_SUSPENDED, NULL); // переделал на ваш вариант
}
 
DWORD WINAPI CWoodFon12Dlg::WriteThread(LPVOID lpParam)
{
    CWoodFon12Dlg * pThis = (CWoodFon12Dlg*)lpParam;
    DWORD temp, signal; //temp - переменная-заглушка
    overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);
    while (1)
    {
        WriteFile(pThis->m_hCom, bufwr, strlen(bufwr), &temp, &overlappedwr);
    //.............    
      SuspendThread(m_pThis->writer); // тут происходит исключение
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
23.11.2016, 22:13
Цитата Сообщение от RazDva1212 Посмотреть сообщение
тут происходит исключение
Я же написал выше... m_pThis убрать вообще.
C++
1
SuspendThread(pThis->writer);
0
0 / 0 / 1
Регистрация: 15.08.2016
Сообщений: 23
23.11.2016, 22:53  [ТС]
DrOffset, уже разобрался спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2016, 22:53
Помогаю со студенческими работами здесь

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

Работа со статическими файлами
Если работаю со стаьическими файлами ] тактическими файлами из папки публик, значит ли это , что при использование пути в виде...

Баг с переменными в классе
Встречал ли кто-нибудь из вас баг: Есть Библиотека скриптов, в которой есть один класс. Public Class DocInfoCollectionUtil ...

Работа с локальными репозитариями
Всем привет! У меня есть проект в каталоге /d/www/site/. Сделал коммиты. Теперь надо сделать бекап. Сохранить копию репозитария в...

Как работать с переменными, объявленными в другом классе?
Добрый день! Помогите, пожалуйста, объявила через конструктор переменные. затем запускается Menu(). Оттуда переходим в Ans1. Как...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru