|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||
fstream некорректно работает в потоке созданном CreateThread02.02.2020, 22:08. Показов 2208. Ответов 10
Здравствуйте! Я пишу программку, которая получает TCP пакеты (их содержимое) от сервера и сохраняет их в файл. Делается это в потоке. Поток создаю функцией CreateThread, с файлами работаю посредством fstream. В файл успешно записываются сообщения от сервера, но только в том случае, если сообщения примерно одинаковой длины! Если длина сообщений разнится, то в файле некоторые сообщения дублируются, какие-то сообщения теряются, вообщем плохо получается. Я не могу понять почему так! Я пробовал по разному, сначала думал, что fstream как-то плохо себя в потоке ведет, и переписал с системными функциями CreateFile и WriteFile, но результат тот же. Ещё я пробовал записывать сообщения не сразу, а складывать какое-то их кол-во в буфер, а потом записывать этот буфер, в котором содержится 10-20 сообщений, в файл, но не помогло.
Среда разработки Qt, но для работы с сетью и потоками я использую WinAPI функции, а Qt только для QUI. Вот код функции потока
message from server 1 message from server 2 message from server ... но, если я пробую генерировать на сервере сообщения разной длины, то они записываются в файл некорректно, с коллизиями, путаются между собой Если нужно, могу привести полный код функции threadProc
0
|
||||||
| 02.02.2020, 22:08 | |
|
Ответы с готовыми решениями:
10
Скачивание файлов стало некорректно работать в отдельном потоке
В VS2015 не работает fstream |
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||||||||||||
| 03.02.2020, 13:23 [ТС] | ||||||||||||||||
|
Спасибо за ответ!
Вот полный код поточной функции
Вообще, все работает, если не разделять сообщения, а просто записывать содержимое принятого буфера в файл Если сообщения такого вида 1-й пакет [message 1\n] 2-й пакет [message 2\n] Я просто пишу
Но я хочу сделать дополнительную проверку, ведь размер буфера, который отправляет сервер может быть больше чем MAX_RECV_BUF_SIZE, конечно, можно сделать MAX_RECV_BUF_SIZE большим, но это выглядит как-то не очень, поэтому я решил проверять кол-во сообщений в одном пакете, например, сообщения могут выглядеть так: 1-й пакет [message 1\nmessa] 2-й пакет [ge 2\nmessage 3\n] 3-й пакет [some data from ser] 4-й пакет [ver\nlolollolloollol\n] И я вроде как успешно разделяю их, но вот в файл сообщения записываются плохо ![]() Под пакетом я подразумеваю не сам TCP пакет, а тот кусочек данных, который приняла функция recv Или может быть я вообще не рационально это делаю и есть более хороший способ Добавлено через 24 минуты Сам смысл этой этой части программы в том, что я постоянно принимаю TCP пакеты от сервера, достаю из этих пакетов сообщения, которые разделяются символом '\n' и сохраняю их в файл с временной меткой полученного сообщения. Файл имеет имя сегодняшней даты, например "03 02 20.txt", если программа обнаруживает, то начался новый день, то она создаст новый файл "04 02 20.txt" и начнет записывать сообщения в него. Ещё отмечу что размер буфера, который отправляет сервер мне не известен, поэтому я и провожу такую проверку с разделением сообщений Вот так я создаю поток, попробовал назначить ему высокий приоритет, но не помогло
Перед записью я пробовал использовать flush(), но проблема не решилась
0
|
||||||||||||||||
|
фрилансер
6466 / 5683 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|
| 03.02.2020, 13:32 | |
|
peoplep8, как отлаживать подобное:
1) все операции вывода в файл заменить на вызов функции, в которой: - выводимая строка выводится в лог (если символы в строке непечатные, то лучше выводить классический в hex виде) - производится запись в файл 2) в этот же лог можно выводить и любые другие события потока, чтобы проследить их порядок 3) запускаешь, смотришь лог. Уже на этом этапе можно много удивительного обнаружить
1
|
|
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||
| 03.02.2020, 14:03 [ТС] | ||||||
|
Спасибо, я бы так и делал, но когда я собираю проект как Debug (чтобы иметь возможность выводить лог в консоль Qt) и запускаю программу прямо из Qt, то она не имеет прав ни на что, я не знаю почему так, ведь я работаю в Qt от имени администратора! Она даже файлы не создает! Кроме того, в режиме отладки программа собирается минут 5) Может попробую как-нибудь консоль создать, хотя у меня QUI приложение. А пока для отладки использовал QMessageBox и просто выводил ошибки в файл
Добавлено через 17 минут Вот еще кусочек кода, как сервер отправляет сообщения
0
|
||||||
|
фрилансер
6466 / 5683 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
||
| 03.02.2020, 14:10 | ||
|
peoplep8, какую IDE используешь? Надо разобраться, с такой ерундой невозможно разрабатывать и отлаживать. Может, переустановка поможет
Добавлено через 2 минуты также настрой количество потоков для работы компилятора, поставь значение, равное количеству ядер минус 1 . В студии и в QtCreator это настраивается
1
|
||
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
| 03.02.2020, 14:15 [ТС] | |
|
Я использую QtCreator 5.13.2 в Windows, собирает все это дело MinGW x64. Вообще, я новичек в Qt и использую его только для QUI. Попробую переустановить, но с моими ресурсами это займет достаточно времени)
Добавлено через 1 минуту Хорошо, попробую
0
|
|
|
фрилансер
6466 / 5683 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|
| 03.02.2020, 14:17 | |
|
peoplep8, какая IDE используется?
QtCreator? Добавлено через 1 минуту peoplep8, пристегни проект в ZIP . Только папки release и debug удали, а также экзешники Добавлено через 34 секунды сам не обещаю поразбираться, если только время будет. Но, может, кто более свободный поможет
1
|
|
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
| 03.02.2020, 16:27 [ТС] | |
|
Да, спасибо, сегодня вечером прикреплю архив
0
|
|
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
| 03.02.2020, 17:43 [ТС] | |
|
Ураааа!!!!! Все работает! Я забыл про то что буфер нужно обнулять XD Спасибо! А я еще думаю, ну что может быть там не так... Мой мозг просто забыл про обнуление :/
0
|
|
| 03.02.2020, 17:43 | |
|
Помогаю со студенческими работами здесь
11
работает fstream в VC++2010 Как работает write в fstream? fstream не работает и чтение и запись fstream::tellp() не работает как надо. Почему не работает код при переходе на fstream? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|