@dlangru

Страница 561 из 719
Ievgenii
10.05.2018
12:36:54
Он за одну итерацию должен все скинуть туда (в свой буфер)

Pavel
10.05.2018
12:37:32
Вот так вот, бывает что не за одну итерацию

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

Google
Ievgenii
10.05.2018
12:43:54
Если у тебя, разви что, буфер будет 100Кб

Но я бы все равно делал за один проход

Так и код будет проще

И понимание кода улучшится

Pavel
10.05.2018
12:44:19
Ну ты же так не будешь доделывать работу фактически

Ievgenii
10.05.2018
12:44:22
Да и такая вероятность мала..

Pavel
10.05.2018
12:44:36
Лучше уж дописать туда по максимуму пока есть возможность

Ievgenii
10.05.2018
12:44:47
Ты же пытаешься пистаь асинхронный код

Pavel
10.05.2018
12:45:13
Да и такая вероятность мала..
Слушай тут странно рассуждать о вероятностях. Я у себя по трейс логам все эти кейсы видел. Очень нередко данные в сокет пишутся за 3-4 захода по 500-1000 байт

Иногда в 1 заход 4Кб бывает

Ievgenii
10.05.2018
12:45:38
Если у тебя, по какой-то не понятной причине, буфер вышел 100Кб и сокет СВЕРХ быстрый и успивает ВСЕ скинуть!

То ты и будешь зависать там...

Google
Pavel
10.05.2018
12:46:10
На проде все эти проблемы усилились, в реальных интернетах сокеты гораздо медленнее чем на локалхосте

Ievgenii
10.05.2018
12:46:46
Это твое дело

Pavel
10.05.2018
12:47:12
То ты и будешь зависать там...
Если будет огромный буфер то да, но 4кб буфер это разумная альтернатива Если мы его полностью записали в сокет, то можно пойти поработать над остальными событиями

Ievgenii
10.05.2018
12:47:18
Но лично я бы это делал за раз. Если за раз он больше не принял - значит буфер сокета не готов больше принять

Он же по какой-то причине больше не взял

А не из-за того, что просто соседний процесс начал писать что-то куда-то

Сам посуди

Хрен его знает...

Может ты и прав

Я не тестил

Stanislav
10.05.2018
12:49:19
Я не тестил
Зато сообщений написал целую гору) а нам это читать приходится

Pavel
10.05.2018
12:49:37
https://github.com/andikleen/eproxy/blob/master/eproxy.c#L235 вот тут в цикле пишем пока пишется, во всех других реализациях тоже.

Ievgenii
10.05.2018
12:53:49
https://github.com/nginx/nginx/blob/008e9caa2a5b784d337422f1dc4290edfb9cc640/src/os/unix/ngx_files.c#L31

Сысоеву я верю...

Я не вижу вычитываний в цикле

Сколько прочел в буфер - столько прочел. Значит больше нет

И это верно

https://github.com/nginx/nginx/blob/008e9caa2a5b784d337422f1dc4290edfb9cc640/src/os/unix/ngx_files.c#L193

Google
Ievgenii
10.05.2018
12:56:04
Но писать - он пишет в цикле

Pavel
10.05.2018
12:56:57
А что конкретно делает эта функция и при каких условиях ? Там какие то aio, треды

Ievgenii
10.05.2018
12:57:18
Но при этом он принемает по сколько писать в этот стрим

Оформляй крсиво и делай либу

Ned Ogl
10.05.2018
13:28:13
есть способ избежать того факта, что try-catch-finally образует собственный scope?

у меня переменные внутри try открывают файлы, catch ловит файловые исключения, но переменые потом не видать извне. есть способ этого избежать окромя объявления этих переменных сразу снаружи?

Dark
10.05.2018
13:33:43
Объявить их снаружи. Не?

Ned Ogl
10.05.2018
13:42:52
Dark
10.05.2018
13:44:10
а кроме?
Никак

Ievgenii
10.05.2018
13:48:10
А в чем проблема то?

Сделай 2 трая

Если ты уверен, что исключение не при открытии файла

White_116
10.05.2018
15:05:42
Как дебагер запустить под шиндовс 7 в VSCode?

Pavel
10.05.2018
15:07:38
Я в линуксе то не смог

Ned Ogl
10.05.2018
15:21:13
Denis
10.05.2018
15:22:19
А каково обоснование этой идеологии?
даже лень объяснять блоки кода бесплатны и хорошо если их будет побольше

Ievgenii
10.05.2018
15:23:25
Ned Ogl
10.05.2018
15:25:38
А зачем они тебе в кетче?
чтобы писать не myClass obj; try { obj = new myClass(..); } catch(...){...} а сразу try { auto = new myClass(..) } ...

Ievgenii
10.05.2018
15:26:00
Это я понял

Google
Ievgenii
10.05.2018
15:26:08
Зачем они тебе в кетче?

Pavel
10.05.2018
15:26:20
Ну у тебя ж конструктор наверное не кидает исключений?

можешь и вне кетча написать auto obj = new myClass()

Ned Ogl
10.05.2018
15:27:20
Ну у тебя ж конструктор наверное не кидает исключений?
кидает, причём гору различных исключений

Ievgenii
10.05.2018
15:27:42
Но в кетче то тебе зачем он тогда?

Если ты не помжешь его даже создать без 100% гарантии?

Ned Ogl
10.05.2018
15:28:50
ну окей, это логично

Ievgenii
10.05.2018
15:29:02
Если есть исключение на момент создания, что в принципи плохо, то в кетче ты ничего не сможешь сделать с объектом, т.к. его у тебя просто нет

Ned Ogl
10.05.2018
15:29:58
мне тогда просто непонятно, что происходит на этапе myClass obj; и что из себя этот obj представляет, особенно учитывая, что у myClass нет пустого конструктора.

Admin
ERROR: S client not available

Ned Ogl
10.05.2018
15:30:23
это тогда просто .... указатель? или что?

ссылка?

null?

Ievgenii
10.05.2018
15:31:44
Я затрудняюсь ответить, что там будет

Не делал так :)

Pavel
10.05.2018
15:32:30
Да там вроде будет null

Denis
10.05.2018
15:32:39
так делать не надо, но, скорее всего, там будет null

Pavel
10.05.2018
15:32:42
Ну можно проверить (obj is null)

Ievgenii
10.05.2018
15:34:22
Подобная конструкция нужна для того, если ты присваиваешь (создаешь) туда разные объекты. Скажем в зависимости от входного параметра:

Google
Ievgenii
10.05.2018
15:34:37
User obj; if (var >= 5) { obj = new UserLop(); }else{ obj = new UserTest(); }

Ned Ogl
10.05.2018
15:35:28
вот тебе прям кусок кода SerialPort standCOM, PSICOM; SC config; try { config = readStruct!SC(configFileName); standCOM = new SerialPort(config.stand_COM.path, config.stand_COM.baud, config.stand_COM.mode); PSICOM = new SerialPort(config.PSI_COM.path, config.PSI_COM.baud, config.PSI_COM.mode); } catch (FileException fe){ stderr.writeln("Config file parsing error! ", fe.msg); return 2; } catch (SerialPortException spe){ stderr.writeln("Failed to open one or both COM ports: ", spe.msg, " Maybe try run with `sudo`?."); return 3; }

Ievgenii
10.05.2018
15:37:00
В примере выше я не вижу смысла выносить из try

Пусть будет все в одном месте

Имхо

Ned Ogl
10.05.2018
15:38:09
Пусть будет все в одном месте
а потом config и оба COM-a используются

и в случае если они в try, их потом не видать снаружи

Ievgenii
10.05.2018
15:38:50
Конечно

Если ты хочешь продолжать работать с ними - ты обязан и последующий код пистаь в try

Иначе нет гарантий, что они создались

Ned Ogl
10.05.2018
15:41:50
Иначе нет гарантий, что они создались
есть, потому что если они не создались, мы вылетаем напрочь из main

Ievgenii
10.05.2018
15:42:10
try { config = readStruct!SC(configFileName); standCOM = new SerialPort(config.stand_COM.path, config.stand_COM.baud, config.stand_COM.mode); PSICOM = new SerialPort(config.PSI_COM.path, config.PSI_COM.baud, config.PSI_COM.mode); } catch (FileException fe){ stderr.writeln("Config file parsing error! ", fe.msg); } catch (SerialPortException spe){ stderr.writeln("Failed to open one or both COM ports: ", spe.msg, " Maybe try run with sudo?."); }

И вот ты уже не вылетаешь

Но объектов нет

Ned Ogl
10.05.2018
15:42:39
ну окей, но мне потом надо на 2 потока разваливаться

тоже внутри try?

Ievgenii
10.05.2018
15:42:45
Конечно компилятор может это найти и обработать...

Ну смотри

Ну а если они не создались и ты попытаешься с ними работать? Будет ошибка

Я точно не знаю как принято в С/С++. Но бросать исключения/ошибки в конструкторе - плохая затея

Что там у сборщика будет - хрен его знает

В твоем случае нужно делать так, как ты привел в примере

Страница 561 из 719