Форум программистов, компьютерный форум CyberForum.ru

проверьте, пожалуйста, мой первый код на c++ - C++

Восстановить пароль Регистрация
 
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
08.02.2010, 13:31     проверьте, пожалуйста, мой первый код на c++ #1
Переучиваюсь с Delphi на C++
Посмотрите, пожалуйста, корректность, стиль программирования, и т.п. с точки зрения visual c++
Если бы этот код достался Вам на поддержку, что Вам не понравилось бы?
locker.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
 
// реализация блокировщика, который функционирует подобно критическим секциям
// но позволяет указывать максимальное время ожидания блокировки
class LOCKER
{
private:
    HANDLE  m_Mutex;            // Mutex используемый для блокировок
    int     m_DeadlockTime;     // максимально время ожидания блокировки
    LONG    m_RecursionCount;   // счетчик рекурсии (сколько раз вызывался lock из текущего потока)
    LONG    m_Thd;              // заблокировавший поток
public: 
    void lock();
    void unlock();
    LOCKER(const int pDeadlockTime); // параметр, максимальное время ожидания блокировки
    ~LOCKER();
};
locker.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include "windows.h"
 
#include "locker.h"
 
//пока заглушки
void trace(const char*){return;}
void error(const char*){return;}
 
LOCKER::LOCKER(const int pDeadlockTime)
{
    m_Mutex = CreateMutex(0, FALSE, 0);
    m_RecursionCount    = 0;
    m_Thd               = 0;
    m_DeadlockTime  = pDeadlockTime;
    trace("LOCKER::LOCKER");
}
 
LOCKER::~LOCKER()
{
    CloseHandle(m_Mutex);
    trace("LOCKER::~LOCKER");
}
 
void LOCKER::lock()
{
    LONG CurThd = GetCurrentThreadId();
    // блокировка осуществленна текущим потоком?
    if ( InterlockedCompareExchange(&m_Thd, 0, 0 ) == CurThd)
    {
        m_RecursionCount++;
        trace("LOCKER::lock рекурсия++");
    }
    else
    {
        trace("LOCKER::lock пытаюсь заблокировать Mutex");
        if (WAIT_OBJECT_0 == WaitForSingleObject(m_Mutex, m_DeadlockTime)) 
        {
            if (m_Thd != 0) error("LOCKER::lock (Thd!=0) чего быть не должно");
            m_Thd = CurThd;
            m_RecursionCount++;
            trace("LOCKER::lock lock");
        }
        else error("LOCKER::lock Deadlock");
    }
}
 
void LOCKER::unlock()
{
    if (GetCurrentThreadId() == m_Thd)
    {
        trace("LOCKER::unlock рекурсия--");
        if (0 == (--m_RecursionCount) )
        {
            trace("Освобождаю блокировку");
            m_Thd = 0;
            ReleaseMutex(m_Mutex);
        }
    } 
    else error("Пытаюсь освободить, хотя блокировки небыло, или была не из этого потока");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2010, 13:31     проверьте, пожалуйста, мой первый код на c++
Посмотрите здесь:

C++ Проверьте пожалуйста код
Проверьте пожалуйста код (C++) C++
C++ Проверьте пожалуйста код
C++ Проверьте пожалуйста код на правильность !
Проверьте код пожалуйста C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
08.02.2010, 14:10     проверьте, пожалуйста, мой первый код на c++ #2
WinAPI я пару раз в глаза видел, но всё-таки сделаю несколько замечаний.
1)
Цитата Сообщение от SkyN Посмотреть сообщение
int m_DeadlockTime; // максимально время ожидания блокировки
время в чём? секундах? миллисекунды?
2)
Цитата Сообщение от SkyN Посмотреть сообщение
LOCKER::~LOCKER()
{
CloseHandle(m_Mutex);
trace("LOCKER::~LOCKER");
}
объект LOCKER можно передавать в функцию/создавать массив LOCKER'ов? (т.е. копировать его можно?)
а т.к. явно конструктор копирования не указан, то будет использована его синтезируемая версия, которая почленно скопирует данные в классе. а это значит, что
Цитата Сообщение от SkyN Посмотреть сообщение
HANDLE m_Mutex;
будет указывать на один и тот-те адрес во всех экземплярах LOCKER. и соответственно при вызове деструктора для любого объекта все остальные объекты тоже будут изменены. так и задумывалось?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 15:51     проверьте, пожалуйста, мой первый код на c++ #3
конечно, можно всю программу написать исключительно прописными буквами, но существует какой-то "жаргон", а ты как раз спрашиваешь о "сопровождать". я бы, когда увидел
C++
1
2
class LOCKER
{
уже понял бы, что буду иметь головную боль...
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
09.02.2010, 00:41  [ТС]     проверьте, пожалуйста, мой первый код на c++ #4
to zim22:
1) Спасибо, поправил
2) ОГРОМНОЕ СПАСИБО, это именно те грабли, которых я боюсь, подсмотрел как реализован CObject, поправил.

to novi4ok
Спасибо, поправил, но меня смущает, что глядя на название я не понимаю это название типа или переменной. К тому же, как я понял изучая исходный код, давать переменной и типу имена различающиеся только реестром букв нормальная практика. К сожалению, я ни где не нашел свода хорошего тона именования объектов, буду благодарен если ткнете носом. Или вышлите на nebotov сабака маил ру.

Возможно ли использовать классы CTime, CString в проекте, при создании которого указывалась что он не MFC?

Текущий h файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
// реализация блокировщика, который функционирует подобно критическим секциям
// но позволяет указывать максимальное время ожидания блокировки
class Locker
{
private:
    HANDLE  m_Mutex;            // Mutex используемый для блокировок
    int     m_DeadlockMilliseconds;     // максимально время ожидания блокировки (миллисекунд)
    LONG    m_RecursionCount;   // счетчик рекурсии (сколько раз вызывался lock из текущего потока)
    LONG    m_Thd;              // заблокировавший поток
// вызываем ошибку при попытке копирования/присвоения
    Locker(const Locker& objectSrc);            // no implementation
    void operator=(const Locker& objectSrc);    // no implementation
public: 
    void lock();
    void unlock();
    explicit Locker(const int pDeadlockMilliseconds=1000); // параметр, максимально время ожидания блокировки
    ~Locker();
};
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:52     проверьте, пожалуйста, мой первый код на c++ #5
google-> guidelines code c++

а вот - с большим юмором обратные рекомендации: как писать код, в котором никто не сможет разобраться. рекомендую в минуты стресса для поднятия духа:

http://mindprod.com/jgloss/unmain.html

использование mfc можно включить уже после создания проекта
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.02.2010, 09:49     проверьте, пожалуйста, мой первый код на c++ #6
Цитата Сообщение от SkyN Посмотреть сообщение
explicit Locker(const int pDeadlockMilliseconds=1000);
explicit запрещает неявное преобразование типов.
т.е. ты не сможешь написать
C++
1
Locker l = 10;
(хотя ты полюбому не сможешь это написать, т.к. у тебя конструктор копирования объявлен private )

конструктор с одним параметром наоборот разрешает его.
так что или убери explicit, или значение параметра по умолчанию.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.02.2010, 10:01     проверьте, пожалуйста, мой первый код на c++ #7
SkyN, первый код и сразу своя блокировка потоков? А готового мутекса нет? Или он плох? Чем именно?

Добавлено через 2 минуты
Хотя, у меня тоже своя коряга каталогов коде, кажется, в десятом, а может и раньше.
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
09.02.2010, 10:57  [ТС]     проверьте, пожалуйста, мой первый код на c++ #8
to zim22:
я хочу чтобы можно было написать
C++
1
2
3
Locker lock(); // т.е. возьмется значение по умолчанию
//или
Locker lock2(5000);
но нельзя
C++
1
2
3
4
5
6
7
8
9
10
Locker lock = 5000; // нельзя (т.к. не понятна логика преобразования int к объекту блокировка)
//или
Locker lock(); // <- это можно
Locker lock2 = lock; // нельзя (вызвав деструктор любого объекта, испортишь другой)
//или
Locker lock2(); // <- это можно
lock2 = 5000;   // нельзя (т.к. не понятна логика преобразования int к объекту блокировка)
//или
Locker lock3(); // <- это можно
functionName(lock3); // нельзя, (т.е. не хочу чтобы при выходе из функции закрылся хендл мьютекса)
to taras atavin:
главная цель переучивания на си (для меня), заключается в использовании большего количества готовых кусков кода )
но для начала я хочу переделать свою, уже готовую, программу, которая в данный момент написана на Delphi.
Готовые решения (искал для Delphi, возможно для с++ они есть, пока я не очень хорошо ориентируюсь в библиотеках с++) мне не подошли т.к.:
1) Построенные на мьютексах, не позволяют использовать рекурсию
2) Построенные на критических секциях, не позволяют отлавливать deadlock'и
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 11:00     проверьте, пожалуйста, мой первый код на c++ #9
Цитата Сообщение от SkyN Посмотреть сообщение
главная цель переучивания на си (для меня), заключается в использовании большего количества готовых кусков кода )
тогда с здесь ни при чем: кода много, но повторно его использовать не всегда просто. прямой путь тебе - в java или c#.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2010, 11:15     проверьте, пожалуйста, мой первый код на c++
Еще ссылки по теме:

Написать код для игры НИМ. проверьте пожалуйста тот ли это код C++
C++ Проверьте код пожалуйста на цикл в С++
C++ Проверьте код пожалуйста

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

Или воспользуйтесь поиском по форуму:
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.02.2010, 11:15     проверьте, пожалуйста, мой первый код на c++ #10
Цитата Сообщение от SkyN Посмотреть сообщение
Готовые решения мне не подошли
посмотри библиотеку boost
с большой степенью вероятности там уже есть готовые решения, которые подойдут.

Цитата Сообщение от SkyN Посмотреть сообщение
Locker lock(); // т.е. возьмется значение по умолчанию
здесь ты не определяешь переменную lock.
это объявление функции, которая называется lock, ничего не принимает и возвращает объект типа Locker

Цитата Сообщение от SkyN Посмотреть сообщение
Locker lock2 = lock; // нельзя (вызвав деструктор любого объекта, испортишь другой)
здесь деструктор не вызывается. вызывается конструктор копирования.
Yandex
Объявления
09.02.2010, 11:15     проверьте, пожалуйста, мой первый код на c++
Ответ Создать тему
Опции темы

Текущее время: 23:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru