Re[13]: Межпотоковое кидание исключений
От: _FRED_ Черногория
Дата: 04.06.05 23:02
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

[...прочитано...]

СМ>>>а вот например посадка самолета. кто полетит на нем, если его управление так написано. увольте! так что для студентов это сойдет, для реальных — ну это на вашей совести.


_FR>>Да, у меня интерес сугубо академический. Пытаюсь расширить кругозор и вооружиться на будущее.


СМ>а что тут академического. обычный программистский разговор. программа работать будет, сдать заказчику ее можно, но [...]


"Это не наш метод" (с)

СМ>если она вылетит в момент посадки самолета (читай переключния подстанции (для москвичей)), то что? совесть не будет мучать?


Конечно, будет, но, имхо, для _изучения_ полезно и то, что при некоторых, даже заранее известных, условиях не работет, потому что зачастую в таких проектах отдельные компоненты реализованы... как-то... интереснее что ли, чем в хорошо проверенной "железной" (если такие есть ) библитотеке и "оно" заставляет придаваться мечтам или дискуссиям о вкусной панацее.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 462>>
Help will always be given at Hogwarts to those who ask for it.
Re[12]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 23:06
Оценка:
Здравствуйте, adontz, Вы писали:

A>Это зря. Там позапрошлогодняя версия. Лучше я на почту новую скину.


Передумал, лучше здесь

http://www.rsdn.ru/File/2053/XWPL.rar (411Кб, в распакованном состоянии много больше!!!)

Из потенциально интересного там ещё класс строки. Всего остального пока в новой версии нет.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 23:10
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Да уж , простым чтением-запуском там не обойтись, на первый взгляд подчти вся логика в __asm {...}


Чтоб отлаживаться (поглядеть что да как) поставь точку останова внутри __CxxFrameHandler (run to cursor не делай, исключения обрабатываются с заходом в kernel32 и не все методы отладки работают) кинь исключение и смотри что будет.
Вся логика в __CxxFrameHandlerInternal
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.06.05 23:14
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>как они относятся к фиберам? какимим исходниками пользовались 7 или 7.1 там разница есть


Между прочим у 6.0 был страшный глюк с повторным вызовод деструктора для объекта исключения
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Межпотоковое кидание исключений
От: Chez Россия  
Дата: 06.06.05 06:37
Оценка:
Здравствуйте, adontz, Вы писали:

Почитал критику, она состоятельна

А если попробовать вместо C++ исключений использовать SEH с кодом EXCEPTION_CONTINUE_EXECUTION ?
void _throw_remote_proc(DWORD nNumberOfArgs, const ULONG_PTR* args)
{
    RaiseException(MY_REMOTE_EX_CODE, 0, nNumberOfArgs, args); // exception
}

// ........

class ex
{
    public:
        int data;
    public:
        ex(): data(0)
        {
        }
        ex(int _data): data(_data)
        {
        }
};
//
bool ready = false;
//
int ex_handler(int current_thread_state)
{
    if (GetExceptionCode() == MY_REMOTE_EX_CODE)
    {
    LPEXCEPTION_POINTERS pp = GetExceptionInformation();
        ....
        // report the thread state using `current_thread_state`
        ...
    return EXCEPTION_CONTINUE_EXECUTION;
    }
    else
        return EXCEPTION_CONTINIUE_SEARCH;
}

DWORD CALLBACK ThreadProc(LPVOID lpParam)
{
    ready = true;
    int current_thread_state = 0;
    __try
    {
        for(;)
        {
                      current_thread_state++;
            Sleep(1);
        }
    }
    __catch (ex_handler(current_thread_state))
    {
        // Сюда никогда не попадаем
    }
    ready = true;
    return 0;
}
//
int main(int argc, char * argv[])
{
    DWORD thread_id;
    CloseHandle(CreateThread(NULL, 0, ThreadProc, NULL, 0, &thread_id));
    while (!ready)
    {
        Sleep(1);
    }
    ex * e = new ex(10);
    ready = false;
    throw_remote(thread_id, e);
    while (!ready)
    {
        Sleep(1);
    }
    return 0;
}


Раскритикуйте и это плиз.
По-моему этот вариант должен работать всегда кроме случаев когда поток уже находится в состоянии обработки SEH исключения.
Но эти куски кода можно защитить обернув блоки в которых можно кидать исключения "извне" критической секцией.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re: Межпотоковое кидание исключений
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.06.05 07:24
Оценка:
Здравствуйте, adontz, Вы писали:

A>Решение судя по всему кросс-компиляторное.


И определенно не кросс-платформенное. А надежное и кросс-платформенное, в том числе и кросс-компиляторное, решение предложил MaximE: Re: Межпотоковое кидание исключений
Автор: MaximE
Дата: 03.06.05
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: Межпотоковое кидание исключений
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.06.05 16:47
Оценка:
A>Мне такое удобно делать, чтоб остановить поток слушающий сокет, потому что message-queue там нету и по-другому сообщение не передать.

Гм, вообще то такие вещи можно делать при помощи APC. С блокирующими сокетами вполне работает на всей линейке вин32.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Межпотоковое кидание исключений
От: SergH Россия  
Дата: 08.06.05 16:54
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Гм, вообще то такие вещи можно делать при помощи APC. С блокирующими сокетами вполне работает на всей линейке вин32.


Т.е. пока поток ждёт в recv, он находится в алертабельном состоянии? Интересно. Это где-нибудь описано?
Делай что должно, и будь что будет
Re[2]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.06.05 16:54
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Гм, вообще то такие вещи можно делать при помощи APC.


Так и вышло под конец http://www.rsdn.ru/Forum/Message.aspx?mid=1206410
Автор: adontz
Дата: 04.06.05


AS>С блокирующими сокетами вполне работает на всей линейке вин32.


Да, я проверял — работает. Но два одинаковых мнения лучше
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Межпотоковое кидание исключений
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.06.05 16:56
Оценка: :)
AS>>Гм, вообще то такие вещи можно делать при помощи APC. С блокирующими сокетами вполне работает на всей линейке вин32.

SH>Т.е. пока поток ждёт в recv, он находится в алертабельном состоянии? Интересно. Это где-нибудь описано?


Да. http://gzip.rsdn.ru/Forum/Message.aspx?mid=1213466&amp;only=1
Автор: Andrew S
Дата: 08.06.05
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Межпотоковое кидание исключений
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.06.05 17:04
Оценка: 8 (1)
А если серьезно — то официального описания этого бехавира я не встречал. Но тем не менее, apc вполне работают с блокирующими сокетами, причем, я практически уверен, что сокеты блокируются в alertable wait state специально (причем делается это явно в цикле, поскольку после выполнения apc вайт функция возвращается, надо проверить значение возврата и ждать наново). Поднимать исходники думаю смысла нет — скорее всего, найдем нечто вроде цикла с WaitForSingleObjectEx.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Межпотоковое кидание исключений
От: Andrew S Россия http://alchemy-lab.com
Дата: 26.07.05 21:25
Оценка: 49 (3)
AS>>>Гм, вообще то такие вещи можно делать при помощи APC. С блокирующими сокетами вполне работает на всей линейке вин32.

SH>>Т.е. пока поток ждёт в recv, он находится в алертабельном состоянии? Интересно. Это где-нибудь описано?


AS>Да. http://gzip.rsdn.ru/Forum/Message.aspx?mid=1213466&amp;only=1
Автор: Andrew S
Дата: 08.06.05


Извиняюсь, что поднимаю древнюю тему, но, возможно, народу будет интересно узнать ответ на столь животрепещущий вопрос...
Итак, оказывается, это вполне документировано, но как обычно, размазано по нескольким частям msdn. Для затравки смотрим http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/sol_socket_socket_options.asp
опция SO_OPENTYPE.
#define SO_SYNCHRONOUS_ALERT 0x10
#define SO_SYNCHRONOUS_NONALERT 0x20

При создании сокета при помощи socket по умолчанию задается режим overlapped\alert (== 0), все остальные приведены выше. Изменить можно при помощи setsockopt, либо создавая сокет при помощи WSASocket. Т.о. описываемое выше поведение сокета является официально документированым, а, следовательно, его использование не только вполне безопасно, но и даже очень полезно.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Межпотоковое кидание исключений
От: adontz Грузия http://adontz.wordpress.com/
Дата: 26.07.05 22:23
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Извиняюсь, что поднимаю древнюю тему, но, возможно, народу будет интересно узнать ответ на столь животрепещущий вопрос...


Очень интересно, молодец, что не поленился!
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.