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

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

Ievgenii
10.05.2018
12:43:30

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
Я в линуксе то не смог

Denis
10.05.2018
15:13:37

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
и в случае если они в try, их потом не видать снаружи

Ievgenii
10.05.2018
15:38:50
Конечно
Если ты хочешь продолжать работать с ними - ты обязан и последующий код пистаь в try
Иначе нет гарантий, что они создались

Ned Ogl
10.05.2018
15:41:50

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
Конечно компилятор может это найти и обработать...
Ну смотри
Ну а если они не создались и ты попытаешься с ними работать? Будет ошибка
Я точно не знаю как принято в С/С++. Но бросать исключения/ошибки в конструкторе - плохая затея
Что там у сборщика будет - хрен его знает
В твоем случае нужно делать так, как ты привел в примере