Re: Красота кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.06 03:45
Оценка: 2 (2) +3 :))) :))) :)
Здравствуйте, iix, Вы писали:

iix>Всем привет.

iix>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию данного кода:

Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Красота кода
От: iix  
Дата: 01.02.06 13:16
Оценка: -4 :)
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, iix, Вы писали:


iix>>Здравствуйте, eao197, Вы писали:


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

iix>>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
LM>Как сказали выше есть кроссплатворменные библиотеки для этого.(например, в boost-е что было www.boost.org ), а во-вторых код итак не очень кроссплатформеный, т.к. встречаются
LM>- CreateMutex
LM>- TerminateThread
Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше. А кстати ты бы лучше предложил свой вариант без оберток а мы бы посмотрели и все бы поняли .
Re[13]: Красота кода
От: iix  
Дата: 01.02.06 13:33
Оценка: :))) :))
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, iix, Вы писали:


LM><scipped>

iix>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше.
LM>А в чем минусы готовых кросс-платформенных классов?

Я просто придерживаюсь идеологии все универсальное работае не очень быстро.
Re[17]: Красота кода
От: iix  
Дата: 01.02.06 14:13
Оценка: -4
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, iix, Вы писали:

LM><scipped>
LM>>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
iix>>А я никуда не спешу. Удовольствие надо растягивать.
LM>Ты пишешь:
LM>1. для себя( для удовольствия )
LM>2. на себя( самозанятый )
LM>3. на дядю

LM>Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу


Да я раньше не тратиль свое время на разные форумы а читал умные книжки. И времени было навалом. Кстати тебя наверно дядя заждался уже скорей отключайся от инета и доделывай ему программу для выключения компа
Re[9]: Красота кода
От: iix  
Дата: 01.02.06 12:48
Оценка: :)))
Здравствуйте, eao197, Вы писали:

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

Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Re[10]: Красота кода
От: LuciferMoscow Россия  
Дата: 01.02.06 12:57
Оценка: +3
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, eao197, Вы писали:


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

iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Как сказали выше есть кроссплатворменные библиотеки для этого.(например, в boost-е что было www.boost.org ), а во-вторых код итак не очень кроссплатформеный, т.к. встречаются
— CreateMutex
— TerminateThread
Re[4]: Красота кода
От: GlebZ Россия  
Дата: 31.01.06 19:32
Оценка: 7 (2)
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, GlebZ, Вы писали:


GZ>>Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь.

GZ>>Поэтому лучше RAII.
iix>Просто хотел спросить как иначе но красивше без этих if внутри if написать данную функцию. И как боротся с таким количеством проверок. Чтоли принимать таблетки против паранойй

class CMutex
{
HANDLE m_handle;
public:
CMutex()
{
  m_handle=0;
  m_handle==CreateMutex(NULL,false,NULL);
  if (!m_handle)
     throw Exception("Error");
}
~CMutex(){if (m_handle)CloseHandle(m_handle);};
}
class CThread
{
HANDLE handle;
public:
CMutex()
{
     m_handle=0;
     m_handle=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr)  
     if (!m_handle)
        throw Exception("Error");
}
~CThread(){}
}

void Logging()
{
if (!Logged())
{
   CMutex sendmtx;
   CMutex recvmtx;
   CThread pingthrd;
   CThread recvthrd;
   pingthrd.TerminateThread(0);
   recvthrd.TerminateThread(0);
   mthrd[0]=pingthrd;
   mthrd[1]=recvthrd;
   WaitForMultipleObjects(2,mthrd,true,INFINITE);
}
}

По моему, вполне читабельно.
Re[16]: Красота кода
От: LuciferMoscow Россия  
Дата: 01.02.06 13:59
Оценка: 1 (1) +1
Здравствуйте, iix, Вы писали:
<scipped>
LM>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
iix>А я никуда не спешу. Удовольствие надо растягивать.
Ты пишешь:
1. для себя( для удовольствия )
2. на себя( самозанятый )
3. на дядю

Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу
Re: Красота кода
От: Kubyshev Andrey  
Дата: 31.01.06 18:45
Оценка: -1 :)
Я бы сделал просто в таком стиле. Просто, но со вкусом:


if (!....){
  DbgPrint  ...
  goto error;
}
...
error:
if (pingthrd) {
   TerminateThread(pingthrd,0);
   CloseHandle(pingthrd);
}



Если не просто и это С++ то исключения.
Re[2]: Красота кода
От: GlebZ Россия  
Дата: 01.02.06 10:33
Оценка: -2
Здравствуйте, c-smile, Вы писали:

Обзовем goto как do while и break?
А вы, батенька, и Вирта не читали?
Re[6]: Красота кода
От: Pavel Dvorkin Россия  
Дата: 01.02.06 11:34
Оценка: +2
Здравствуйте, GlebZ, Вы писали:

GZ>>~CThread(){CloseHandle(m_handle);}

GZ> void Terminate(int i){TerminateThread(m_handle, i);};
GZ>>}
GZ>Сорри, конечно забыл.

Ну и правильно, что забыл. Нечего ее вызывать. Некрасиво это
With best regards
Pavel Dvorkin
Re[11]: Красота кода
От: iix  
Дата: 01.02.06 12:58
Оценка: :))
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, GlebZ, Вы писали:


GZ>Вообще очень занятный код. Если мы терминировали потоки, то кто же удалять мутексы будет? Вобщем, здесь логика по самое нехочу.


Во первых мютекс создает основной поток, он же его и удалит, ничего сложного в етом нету . А логика вот в чем ето функция выполняется в основном потоке. Она создает два потока и для них создает 2 мютекса. Мютексы нужны для того чтобы ети два потоко отправляли и принимали данные по очереди. Вот и все
Re[12]: Красота кода
От: GlebZ Россия  
Дата: 01.02.06 13:15
Оценка: +2
Здравствуйте, iix, Вы писали:

iix>Во первых мютекс создает основной поток, он же его и удалит,

Это как? Круто.
iix>ничего сложного в етом нету . А логика вот в чем ето функция выполняется в основном потоке. Она создает два потока и для них создает 2 мютекса. Мютексы нужны для того чтобы ети два потоко отправляли и принимали данные по очереди. Вот и все
Эх молодежь. Использование terminate сродни пустить человеку пулю в лоб, вместо того чтобы просто попросить его выйти. И соответсвенно, придется расчленять труп и вывозить куда-то.
Точно так же, если ты в C++ убиваешь тред, то вся выделенная им память остается. Максимум, terminate может быть использован в системах 24x7 когда у тебя StackOverflow. Чтобы хоть что-то сохранить. Никто не знает в каком состоянии находится система, и существует большая вероятность, что произойдут утечки памяти выделенные потоками.
В данном случае желательно иметь некоторый event, с помощью которого основная функция оповещает потоки о том, что они не нужны. И вот только тогда, детерменированно освободив всю занятую память и задестроив все объекты, потоки должны корректно выйти.
Re[14]: Красота кода
От: LuciferMoscow Россия  
Дата: 01.02.06 13:42
Оценка: +2
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Здравствуйте, iix, Вы писали:


LM>><scipped>

iix>>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше.
LM>>А в чем минусы готовых кросс-платформенных классов?
iix>Я просто придерживаюсь идеологии все универсальное работае не очень быстро.
Ты замятишь разницу в 1% случаев. Еще в меньшем проценте случаев эта разницу будет важна.

А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
Re[12]: Красота кода
От: srggal Украина  
Дата: 01.02.06 13:43
Оценка: +1 :)
Здравствуйте, iix, Вы писали:

iix>Ну лан раскусили люблю я маненько помудится и написать свой код.


Судя по противоричивости пожеланий к написанию кода, Вы передергиваете, а именно любите

помудится

не мальнько, а как минимум — полноценно.

По делу — как уже грили Библиотеки много в чем помогают, кроме того, написание(использование готовых) оберток крайне положительно сказывается на красоте кода; RAII, как уже грили, — сильно упрощает управление ресурсами.

Если хочется своего и без оберток и чтоб красивого, то может надо попытаться на другом языке написать ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Красота кода
От: iix  
Дата: 01.02.06 13:50
Оценка: :))
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, iix, Вы писали:


iix>>Ну лан раскусили люблю я маненько помудится и написать свой код.


S>Судя по противоричивости пожеланий к написанию кода, Вы передергиваете, а именно любите

помудится

не мальнько, а как минимум — полноценно.


S>По делу — как уже грили Библиотеки много в чем помогают, кроме того, написание(использование готовых) оберток крайне положительно сказывается на красоте кода; RAII, как уже грили, — сильно упрощает управление ресурсами.


S>Если хочется своего и без оберток и чтоб красивого, то может надо попытаться на другом языке написать ?

В этом и кайф что я не ищу легких путей. Вот скоро на уровне драйвера напишу IM.
Re[11]: Красота кода
От: Pavel Dvorkin Россия  
Дата: 01.02.06 13:05
Оценка: 1 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, GlebZ, Вы писали:


GZ>Вообще очень занятный код. Если мы терминировали потоки, то кто же удалять мутексы будет? Вобщем, здесь логика по самое нехочу.


Да нормальная логика. Мутексы надо закрыть после закрытия треда, который перед своим окончанием должен их освободить.

В общем, сначала создаем мутексы, потом треды, потом они ждут и отпускают мутексы, потом треды кончаются и извещают родителя, а он закрывает мутексы.
With best regards
Pavel Dvorkin
Re: Красота кода
От: GlebZ Россия  
Дата: 31.01.06 18:42
Оценка: +1
Здравствуйте, iix, Вы писали:

iix>Всем привет.

iix>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код.
В каком смысле? В том что в нем ошибка на ошибке?
Re[2]: Красота кода
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.02.06 11:16
Оценка: +1
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, iix, Вы писали:


iix>Может вам выслать еще одну функцию там также проверка за проверкой. Просто последнее время при программировании я слежу за выходными значениями каждой функции. Раньше было круто не парился я с этими проверками и код был компактнее а сейчач даже незнаю.............

Делай обертки. Делай. Это окупится. Меньше отладки будет.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Красота кода
От: Pavel Dvorkin Россия  
Дата: 01.02.06 11:54
Оценка: +1
Здравствуйте, GlebZ, Вы писали:

GZ>Для того чтобы рассуждать красиво или не красиво, нужно знать что же делается в этих тредах. Пока мы не знаем какую задачу он выполняет, ничего сказать нельзя.


И все равно ее вызывать неприлично. Если не говорить о убиении потоков в чужом процессе, то ИМХО всегда можно сделать так, чтобы поток сам себя корректно завершал.
With best regards
Pavel Dvorkin
Re[10]: Красота кода
От: GlebZ Россия  
Дата: 01.02.06 12:22
Оценка: +1
Здравствуйте, GlebZ, Вы писали:

Вообще очень занятный код. Если мы терминировали потоки, то кто же удалять мутексы будет? Вобщем, здесь логика по самое нехочу.
Re[10]: Красота кода
От: _DAle_ Беларусь  
Дата: 01.02.06 12:54
Оценка: +1
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, eao197, Вы писали:


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

iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.

Да? И даже кросс-платформенные "не канают"?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[12]: Красота кода
От: LuciferMoscow Россия  
Дата: 01.02.06 13:18
Оценка: +1
Здравствуйте, iix, Вы писали:

<scipped>
iix>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше.
А в чем минусы готовых кросс-платформенных классов?

iix> А кстати ты бы лучше предложил свой вариант без оберток а мы бы посмотрели и все бы поняли .

Зачем?! "Захват ресурса — есть инициализация"
Re[3]: Красота кода
От: iix  
Дата: 01.02.06 13:44
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, VladD2, Вы писали:


VD>>Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.


E>Кстати да, есть на что посмотреть. Как на исключение, которое подтверждает правило. При использовании деструкторов и RAII этот код выглядел бы гораздо проще.

E>И для другого правила этот пример так же служит исключением -- готовые библиотеки нужно использовать.

E>Ты еще не знаешь, во что подобными исключениями из правил можно программы на C# превратить

Я тоже как ты меня хлебом не корми, дай что-нибудь свое придумать.
Re[14]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 13:51
Оценка: +1
Здравствуйте, iix, Вы писали:

iix>Я просто придерживаюсь идеологии все универсальное работае не очень быстро.


О скорости лучше всего судить по показаниям профайлера.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Красота кода
От: iix  
Дата: 31.01.06 18:33
Оценка:
Всем привет.
Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию данного кода:

    unsigned int thrdaddr;
    HANDLE mthrd[2];

    if(connected && !logining)
    {
        if(sendmtx=CreateMutex(NULL,false,NULL))
        {
            if(recvmtx=CreateMutex(NULL,false,NULL))
            {
                if(pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr))
                {
                    if(recvthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)RecvThread,this,0,&thrdaddr))
                    {
                        DbgPrint("Login2: succesfull...");
                        logining=true;
                        return true;
                    }
                    else
                        DbgPrint("Login2: hello error...");
                }
                else
                    pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr);

            }
            else
                DbgPrint("Login2: recv CreateMutex error...");
        }
        else
            DbgPrint("Login2: send CreateMutex error...");
    }

    TerminateThread(pingthrd,0);
    TerminateThread(recvthrd,0);
    mthrd[0]=pingthrd;
    mthrd[1]=recvthrd;
    WaitForMultipleObjects(2,mthrd,true,INFINITE);
    CloseHandle(pingthrd);
    CloseHandle(recvthrd);

    CloseHandle(sendmtx);
    CloseHandle(recvmtx);

    return false;



01.02.06 18:13: Перенесено из 'Философия программирования'
Re[2]: Красота кода
От: GlebZ Россия  
Дата: 31.01.06 19:03
Оценка:
Здравствуйте, Kubyshev Andrey, Вы писали:

KA>Я бы сделал просто в таком стиле. Просто, но со вкусом:


KA>if (!....){

KA> DbgPrint ...
KA> goto error;
KA>}
KA>...
KA>error:
KA>if (pingthrd) {
KA> TerminateThread(pingthrd,0);
KA> CloseHandle(pingthrd);
KA>}
Жуть. Даже для С. Можно сделать функцию, что-то Deinintialize. И в ней по проверке handle==0 убивать. И без всяких goto. Сразу return.

KA>Если не просто и это С++ то исключения.

Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь.
Поэтому лучше RAII.
Re[2]: Красота кода
От: iix  
Дата: 31.01.06 19:17
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, iix, Вы писали:


iix>>Всем привет.

iix>>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код.
GZ>В каком смысле? В том что в нем ошибка на ошибке?
Да какойто пароноидальный код получился. Что со мной творится. Неужели я стал параноиком после прочтения книги Windows для профессионалов. Эти CloseHandel меня уже запарили. Последнии мой разработки так и кишат этими проверками. Черт кажется я потихоньку схожу с ума
Re[3]: Красота кода
От: iix  
Дата: 31.01.06 19:22
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь.

GZ>Поэтому лучше RAII.
Просто хотел спросить как иначе но красивше без этих if внутри if написать данную функцию. И как боротся с таким количеством проверок. Чтоли принимать таблетки против паранойй
Re: Красота кода
От: iix  
Дата: 31.01.06 19:26
Оценка:
Здравствуйте, iix, Вы писали:

Может вам выслать еще одну функцию там также проверка за проверкой. Просто последнее время при программировании я слежу за выходными значениями каждой функции. Раньше было круто не парился я с этими проверками и код был компактнее а сейчач даже незнаю.............
Re[5]: Красота кода
От: GlebZ Россия  
Дата: 31.01.06 19:34
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, iix, Вы писали:


iix>>Здравствуйте, GlebZ, Вы писали:



GZ>class CThread

GZ>{
GZ>HANDLE m_handle;
GZ>public:
GZ>CMutex()
GZ>{
GZ> m_handle=0;
GZ> m_handle=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr)
GZ> if (!m_handle)
GZ> throw Exception("Error");
GZ>}
GZ>~CThread(){CloseHandle(m_handle);}
void Terminate(int i){TerminateThread(m_handle, i);};
GZ>}
Сорри, конечно забыл.
Re[3]: Красота кода
От: Kubyshev Andrey  
Дата: 31.01.06 19:49
Оценка:
GZ>Жуть. Даже для С. Можно сделать функцию, что-то Deinintialize. И в ней по проверке handle==0 убивать. И без всяких goto. Сразу return.

Да не, ничего жуткого. Нормальный стиль. Можно как ты делать, а можно и как я. Внатуре !
Re[6]: Красота кода
От: iix  
Дата: 31.01.06 19:56
Оценка:
Да конечно красяво, но я не слишком люблю для простых действий делать классы обертки . Да кстати сначало ета функция выглядела не так а вот как:
bool CIMProto::Login2(char *login,char *pass,u_long status)
{
    unsigned int thrdaddr;

    if(connected && !logining)
    {
        if(sendmtx=CreateMutex(NULL,false,NULL))
        {
            DbgPrint("Login2: send CreateMutex error...");
            return false;
        }
        
        if(recvmtx=CreateMutex(NULL,false,NULL))
        {
            DbgPrint("Login2: recv CreateMutex error...");
            CloseHandle(sendmtx);
            return false;
        }
        
        if(pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr))
        {
            DbgPrint("Login2: ping _beginthreadex error...");
            CloseHandle(sendmtx);
            CloseHandle(recvmtx);
            return false;
        }

        if(recvthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)RecvThread,this,0,&thrdaddr))
        {
            DbgPrint("Login2: recv _beginthreadex error...");
            CloseHandle(sendmtx);
            CloseHandle(recvmtx);
            TerminateThread(pingthrd,0);
            WaitForSingleObject(pingthrd,INFINITE);
            CloseHandle(pingthrd);
            return false;
        }

        DbgPrint("Login2: successfull...")

        return true;
    }

    DbgPrint("Login2: not connected or loginning error...")

    return false;
}

И как на твой взгляд какая функция красивей?
Re[5]: Красота кода
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 31.01.06 20:05
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>
GZ>  m_handle=0;
GZ>

Эта строка лишняя. CreateMutex и _beginthreadex сами инициализируют handle так, как надо.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re[6]: Красота кода
От: iix  
Дата: 31.01.06 20:09
Оценка:
Здравствуйте, Кирилл Лебедев, Вы писали:

КЛ>Здравствуйте, GlebZ, Вы писали:


GZ>>
GZ>>  m_handle=0;
GZ>>

КЛ>Эта строка лишняя. CreateMutex и _beginthreadex сами инициализируют handle так, как надо.
Да не в етом суть вопроса пусть хот десять раз напищет a=a+1. Здесь вопрос не в оптимизации кода а в красоте и оригинальности
Re[7]: Красота кода
От: iix  
Дата: 31.01.06 20:19
Оценка:
Здравствуйте, Я писали:

iix>И как на твой взгляд какая функция красивей?


Как вам эти многократные CloseHandle их бы как нить зделать по другому например так:

bool CIMProto::Login2(char *login,char *pass,u_long status)
{
    unsigned int thrdaddr;

    if(connected && !logining)
    {
        recvthrd=0;
        __try
        {
        if(sendmtx=CreateMutex(NULL,false,NULL))
        {
            DbgPrint("Login2: send CreateMutex error...");
            return false;
        }
        
        if(recvmtx=CreateMutex(NULL,false,NULL))
        {
            DbgPrint("Login2: recv CreateMutex error...");
            return false;
        }
        
        if(pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr))
        {
            DbgPrint("Login2: ping _beginthreadex error...");
            return false;
        }

        if(recvthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)RecvThread,this,0,&thrdaddr))
        {
            DbgPrint("Login2: recv _beginthreadex error...");
            return false;
        }
        }
        __finally
        {
            if(!recvthrd)
            {
            CloseHandle(sendmtx);
            CloseHandle(recvmtx);
            TerminateThread(pingthrd,0);
            WaitForSingleObject(pingthrd,INFINITE);
            CloseHandle(pingthrd);
            }
        }

        DbgPrint("Login2: successfull...");

        return true;
    }

    DbgPrint("Login2: not connected or loginning error...");

    return false;
}
Re[8]: Красота кода
От: iix  
Дата: 31.01.06 20:21
Оценка:
Или блок __finally записать в функцию и вызывать перед return false;
Re: Красота кода
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.06 07:10
Оценка:
Здравствуйте, iix, Вы писали:

Если goto не нравится то:

void foo() 
{

  if(!connected || logingin) return;

  do {
    sendmtx=CreateMutex(NULL,false,NULL); 
    if(!sendmtx) break;
    pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr);
    if(!pingthrd) break;
    ...
    DbgPrint("Login2: succesfull...");
    logingin=true;
    return true;

  } while(false);

  //ABEND handling here
}
Re[7]: Красота кода
От: iix  
Дата: 01.02.06 08:28
Оценка:
А вот к чему я пришол:

bool CIMProto::Login2(char *login,char *pass,u_long status)
{
    unsigned int thrdaddr;

    if(connected && !logining)
    {
        try
        {
            if(sendmtx=CreateMutex(NULL,false,NULL))
            {
                DbgPrint("Login2: send CreateMutex error...");
                throw 0;
            }
        
            if(recvmtx=CreateMutex(NULL,false,NULL))
            {
                DbgPrint("Login2: recv CreateMutex error...");
                throw 1;
            }
        
            if(pingthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)PingThread,this,0,&thrdaddr))
            {
                DbgPrint("Login2: ping _beginthreadex error...");
                throw 2;
            }

            if(recvthrd=(HANDLE)_beginthreadex(NULL,0,(PTHREAD)RecvThread,this,0,&thrdaddr))
            {
                DbgPrint("Login2: recv _beginthreadex error...");
                throw 3;
            }
        }
        catch(int errcode)
        {
            switch(errcode)
            {
            case 3:
                {
                    TerminateThread(pingthrd,0);
                    WaitForSingleObject(pingthrd,INFINITE);
                    CloseHandle(pingthrd);
                }
            case 2: CloseHandle(recvmtx);
            case 1: CloseHandle(sendmtx);
            }

            DbgPrint("Login2: error...");
            return false;
        }

        logining=true;
        DbgPrint("Login2: successfull...");
        return true;
    }

    DbgPrint("Login2: not connected or loginning error...");
    return false;
}
Re[3]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 11:28
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Делай обертки. Делай. Это окупится. Меньше отладки будет.


+1

А еще лучше -- используй готовые. Их сейчас множество, хоть в boost-е, хоть в ACE
Автор(ы): Дуглас С.Шмидт, Стивен Д.Хьюстон

Это первый том двухтомника «Программирование сетевых приложений на
С++», посвященный библиотеке The ADAPTIVE Communication Environment
(ACE) – одной из самых переносимых C++ библиотек, предназначенной для
разработки сложных, многоплатформенных приложений, и широко
используемой во всем мире. В нем читатель знакомится с самой
библиотекой, ее историей, основными чертами ее архитектуры и
принципами использования.
.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 11:30
Оценка:
Здравствуйте, iix, Вы писали:

iix>А вот к чему я пришол:


<...skipped...>

Ужас.

Не завершай нитей через TerminateThread.
Используй готовые библиотеки классов для работы с многопоточностью и синхронизацией.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Красота кода
От: GlebZ Россия  
Дата: 01.02.06 11:52
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну и правильно, что забыл. Нечего ее вызывать. Некрасиво это

Для того чтобы рассуждать красиво или не красиво, нужно знать что же делается в этих тредах. Пока мы не знаем какую задачу он выполняет, ничего сказать нельзя.
Re[2]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 11:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.


Кстати да, есть на что посмотреть. Как на исключение, которое подтверждает правило. При использовании деструкторов и RAII этот код выглядел бы гораздо проще.
И для другого правила этот пример так же служит исключением -- готовые библиотеки нужно использовать.

Ты еще не знаешь, во что подобными исключениями из правил можно программы на C# превратить


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: Красота кода
От: GlebZ Россия  
Дата: 01.02.06 12:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>И все равно ее вызывать неприлично. Если не говорить о убиении потоков в чужом процессе, то ИМХО всегда можно сделать так, чтобы поток сам себя корректно завершал.

Фактически да. В подавляющем количестве случаев можно выйти корректно, или некорректно, но детерменированое, через exception. Трудно придумать ситуацию где такое понадобится TerminateThread. И вообще, тут ошибка. Сразу не подумавши был, из-за вечернего времени. В случае чего должен быть не TerminateThread а _endthreadex.
Re[10]: Красота кода
От: Pavel Dvorkin Россия  
Дата: 01.02.06 13:03
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Pavel Dvorkin, Вы писали:


GZ>Фактически да. В подавляющем количестве случаев можно выйти корректно, или некорректно, но детерменированое, через exception. Трудно придумать ситуацию где такое понадобится TerminateThread. И вообще, тут ошибка. Сразу не подумавши был, из-за вечернего времени. В случае чего должен быть не TerminateThread а _endthreadex.


Ох, не надо. Так ты закончишь не тот тред, что запустил, а самого себя

Тред должен заканчиваться endthreadex в самом себе. И закрыть перед этим хендл. Или просто return. Перед этим он должен как-то уведомить родителя, чтобы тот сделал CloseHandle у себя (счетчик-то исходно равен 2). Если, конечно, он его не сделал сразу после запуска треда. Тогда вообще ничего не надо.
With best regards
Pavel Dvorkin
Re[10]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 13:11
Оценка:
Здравствуйте, iix, Вы писали:

iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.



Серьезное основание
Особенно с учетом, что библиотеки и классы обертки как раз очень сильно облегчают перенос кода на другие ОС.
А если это еще и IM клиент, которому нужно поддерживать коммуникации, то очень рекомендую посмотреть в сторону ACE
Автор(ы): Дуглас С.Шмидт, Стивен Д.Хьюстон

Это первый том двухтомника «Программирование сетевых приложений на
С++», посвященный библиотеке The ADAPTIVE Communication Environment
(ACE) – одной из самых переносимых C++ библиотек, предназначенной для
разработки сложных, многоплатформенных приложений, и широко
используемой во всем мире. В нем читатель знакомится с самой
библиотекой, ее историей, основными чертами ее архитектуры и
принципами использования.
-- там и многопоточности, и синхронизации, и коммуникациям уделяется самое пристальное внимание (для этого и написано). Да еще можно применить ACE_Reactor и ACE_Acceptor/ACE_Connector, тогда про ручное управление потоками можно будет совсем забыть.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Красота кода
От: iix  
Дата: 01.02.06 13:25
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, iix, Вы писали:


iix>>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.


E>

E>Серьезное основание
E>Особенно с учетом, что библиотеки и классы обертки как раз очень сильно облегчают перенос кода на другие ОС.
E>А если это еще и IM клиент, которому нужно поддерживать коммуникации, то очень рекомендую посмотреть в сторону ACE
Автор(ы): Дуглас С.Шмидт, Стивен Д.Хьюстон

Это первый том двухтомника «Программирование сетевых приложений на
С++», посвященный библиотеке The ADAPTIVE Communication Environment
(ACE) – одной из самых переносимых C++ библиотек, предназначенной для
разработки сложных, многоплатформенных приложений, и широко
используемой во всем мире. В нем читатель знакомится с самой
библиотекой, ее историей, основными чертами ее архитектуры и
принципами использования.
-- там и многопоточности, и синхронизации, и коммуникациям уделяется самое пристальное внимание (для этого и написано). Да еще можно применить ACE_Reactor и ACE_Acceptor/ACE_Connector, тогда про ручное управление потоками можно будет совсем забыть.


Ну лан раскусили люблю я маненько помудится и написать свой код.
Re[15]: Красота кода
От: iix  
Дата: 01.02.06 13:52
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, iix, Вы писали:


iix>>Здравствуйте, LuciferMoscow, Вы писали:


LM>>>Здравствуйте, iix, Вы писали:


LM>>><scipped>

iix>>>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше.
LM>>>А в чем минусы готовых кросс-платформенных классов?
iix>>Я просто придерживаюсь идеологии все универсальное работае не очень быстро.
LM>Ты замятишь разницу в 1% случаев. Еще в меньшем проценте случаев эта разницу будет важна.

LM>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время

А я никуда не спешу. Удовольствие надо растягивать.
Re[14]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 13:54
Оценка:
Здравствуйте, iix, Вы писали:

iix>В этом и кайф что я не ищу легких путей. Вот скоро на уровне драйвера напишу IM.


Похоже, мне нужно поменять бомбочку на этой теме. В 'Юмор'.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Красота кода
От: iix  
Дата: 01.02.06 14:01
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, iix, Вы писали:


iix>>В этом и кайф что я не ищу легких путей. Вот скоро на уровне драйвера напишу IM.


E>Похоже, мне нужно поменять бомбочку на этой теме. В 'Юмор'.

Где бомба??? И что она означает. Кстати сайт прикольный и страничка Об авторе тоже. Особенно строка:

А изобретатель велосипедов -- потому, что меня хлебом не корми, дай что-нибудь свое придумать.

Re[18]: Красота кода
От: iix  
Дата: 01.02.06 14:19
Оценка:
Здравствуйте, iix, Вы писали:

iix>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Здравствуйте, iix, Вы писали:

LM>><scipped>
LM>>>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
iix>>>А я никуда не спешу. Удовольствие надо растягивать.
LM>>Ты пишешь:
LM>>1. для себя( для удовольствия )
LM>>2. на себя( самозанятый )
LM>>3. на дядю

LM>>Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу


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


Кстати есть одна крутая формула для данного форума:
 F=exp(x)-1;
 x-это цифра внутри квадратных скобок нпр (Re[17]: Красота кода - 17)
 F-это уровень флейма
Re[16]: Красота кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 01.02.06 14:20
Оценка:
Здравствуйте, iix, Вы писали:

iix>Где бомба??? И что она означает.


Если зайти на форум в браузере и со включенным отображением графики, то на самом первом сообщении этой темы ты увидишь иконку с маленькой бомбочкой. Это признак автомодерирования (если не ошибаюсь в терминах), т.е. кто-то из читателей проголосовал за перенос темы или ее части в другой форум.

iix> Кстати сайт прикольный и страничка Об авторе тоже.


Спасибо. Заходите еще

iix> Особенно строка:

iix>

iix>А изобретатель велосипедов -- потому, что меня хлебом не корми, дай что-нибудь свое придумать.


Ну эта, стараюсь
Автор(ы): Евгений Охотников
Дата: 22.05.2005
Данная статья описывает предложения по организации файловой структуры проектов на C++ и компиляции проектов с помощью Mxx_ru (http://eao197.narod.ru/mxx_ru), а так же показывает, как использовать систему контроля версий Subversion (http://subversion.tigris.org) не только в качестве инструмента для управления версиями исходных текстов, но и для отслеживания зависимостей между проектами.
, по мере
Автор: eao197
Дата: 16.11.05
сил
Автор(ы): Евгений Охотников
Дата: 30.12.2005
Данная статья знакомит читателя с проектом SObjectizer -- инструментом для агентно-ориентированного программирования на C++. Раcсказывается о его истории, текущем состоянии и ближайших перспективах. Обсуждаются некоторые преимущества, которые дает SObjectizer, а также некоторые его недостатки и проблемы.
.
И, как старый изобретатель велосипедов могу дать совет: изобретать нужно меньше. Самое сложное ведь не изобрести, а поддерживать, развивать и сопровождать (образно говоря, сложно не родить, а выростить). И чем больше кода за тебя сопровождают другие, тем лучше.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Красота кода
От: Angler Россия  
Дата: 01.02.06 16:07
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, c-smile, Вы писали:


GZ>Обзовем goto как do while и break?

GZ>А вы, батенька, и Вирта не читали?

Блин щас начнут опять
ЭТО НОРМАЛЬНЫЙ ПОДХОД, КОТОРЫЙ ИСПОЛЬЗУЕТСЯ В ПРОМЫШЛЕННОМ КОДЕ
Re[3]: Красота кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.06 17:12
Оценка:
Здравствуйте, eao197, Вы писали:

E>Ты еще не знаешь, во что подобными исключениями из правил можно программы на C# превратить


В C# нет C-шных библиотек.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Красота кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.06 17:12
Оценка:
Здравствуйте, iix, Вы писали:

iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.


Не позорься. Это же полный лам делать такие заявления.
Во-мервый, есть куча кросплатформных библиотек которые только упростят перенос твоего кода.
Во-вторых, тебе никто не запрещает написать эти библиотеки самостоятельно.

Твой аргумент о требованиях переносимости выглядит просто абсурдно, так как ты пользушся приципиально платформно-зависомой библиотекой (Win32).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Красота кода
От: Awaken Украина  
Дата: 01.02.06 18:18
Оценка:
GZ>Жуть. Даже для С. Можно сделать функцию, что-то Deinintialize. И в ней по проверке >handle==0 убивать. И без всяких goto. Сразу return.

в исходном коде windows подобной жути — жуть
Re: Красота кода
От: Awaken Украина  
Дата: 01.02.06 18:22
Оценка:
Здравствуйте, iix, Вы писали:

iix>Вот сижу и программирую клиента для одного IM и в одной функции получился >извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию


засовываешь все в try-catch, делаешь обертку хендла которая проверяет на NULL (для отдельных хендлов должна проверять на INVALID_HANDLE_VALUE) и кидает исключение.

а лет 5 назад я бы написал через макросы
CHECK_AND_THROW( h = CreateMutex() );
Re: Красота кода
От: gear nuke  
Дата: 05.02.06 18:40
Оценка:
Здравствуйте, iix,

Re[3]: Количество точек выхода из функции
Автор: gear nuke
Дата: 13.09.05


Хотя для данного конкретного случая использовать обёртки (как советуют коллеги) — самое оно. Ручное закрытие хендлов еще понятно где-нибудь в ядре, когда код пишет дядька вроде Руссиновича, да ещё и на ассемблере, а не на С++ (как хорошо известно, компилятору доварять нельзя ).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: Красота кода
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 05.02.06 21:31
Оценка:
Здравствуйте, iix, Вы писали:

iix>Да не в етом суть вопроса пусть хот десять раз напищет a=a+1. Здесь вопрос не в оптимизации кода а в красоте и оригинальности

Боюсь, что чем больше лишних строк, тем код менее красив. Зачем писать операторы, которые не нужны? Они только засоряют код и делают его менее компактным/красивым.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.