9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||
1 | ||||||
fstream некорректно работает в потоке созданном CreateThread02.02.2020, 22:08. Показов 1899. Ответов 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
Скачивание файлов стало некорректно работать в отдельном потоке не работает fstream.h В VS2015 не работает fstream работает fstream в VC++2010 |
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||||||||||||
03.02.2020, 13:23 [ТС] | 3 | |||||||||||||||
Спасибо за ответ!
Вот полный код поточной функции
Вообще, все работает, если не разделять сообщения, а просто записывать содержимое принятого буфера в файл Если сообщения такого вида 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
|
фрилансер
5846 / 5376 / 1103
Регистрация: 11.10.2019
Сообщений: 14,368
|
|
03.02.2020, 13:32 | 4 |
peoplep8, как отлаживать подобное:
1) все операции вывода в файл заменить на вызов функции, в которой: - выводимая строка выводится в лог (если символы в строке непечатные, то лучше выводить классический в hex виде) - производится запись в файл 2) в этот же лог можно выводить и любые другие события потока, чтобы проследить их порядок 3) запускаешь, смотришь лог. Уже на этом этапе можно много удивительного обнаружить
1
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
||||||
03.02.2020, 14:03 [ТС] | 5 | |||||
Спасибо, я бы так и делал, но когда я собираю проект как Debug (чтобы иметь возможность выводить лог в консоль Qt) и запускаю программу прямо из Qt, то она не имеет прав ни на что, я не знаю почему так, ведь я работаю в Qt от имени администратора! Она даже файлы не создает! Кроме того, в режиме отладки программа собирается минут 5) Может попробую как-нибудь консоль создать, хотя у меня QUI приложение. А пока для отладки использовал QMessageBox и просто выводил ошибки в файл
Добавлено через 17 минут Вот еще кусочек кода, как сервер отправляет сообщения
0
|
фрилансер
5846 / 5376 / 1103
Регистрация: 11.10.2019
Сообщений: 14,368
|
|
03.02.2020, 14:10 | 6 |
peoplep8, какую IDE используешь? Надо разобраться, с такой ерундой невозможно разрабатывать и отлаживать. Может, переустановка поможет
Добавлено через 2 минуты нужно ещё уточнить, что промежуточные релизные и дебажные файлы падают в разные папки, а то будет каждый раз перекомпиляция при переключении режима также настрой количество потоков для работы компилятора, поставь значение, равное количеству ядер минус 1 . В студии и в QtCreator это настраивается
1
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
03.02.2020, 14:15 [ТС] | 7 |
Я использую QtCreator 5.13.2 в Windows, собирает все это дело MinGW x64. Вообще, я новичек в Qt и использую его только для QUI. Попробую переустановить, но с моими ресурсами это займет достаточно времени)
Добавлено через 1 минуту Хорошо, попробую
0
|
фрилансер
5846 / 5376 / 1103
Регистрация: 11.10.2019
Сообщений: 14,368
|
|
03.02.2020, 14:17 | 8 |
peoplep8, какая IDE используется?
QtCreator? Добавлено через 1 минуту peoplep8, пристегни проект в ZIP . Только папки release и debug удали, а также экзешники Добавлено через 34 секунды сам не обещаю поразбираться, если только время будет. Но, может, кто более свободный поможет
1
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
03.02.2020, 16:27 [ТС] | 9 |
Да, спасибо, сегодня вечером прикреплю архив
0
|
9 / 6 / 3
Регистрация: 01.07.2018
Сообщений: 49
|
|
03.02.2020, 17:43 [ТС] | 11 |
Ураааа!!!!! Все работает! Я забыл про то что буфер нужно обнулять XD Спасибо! А я еще думаю, ну что может быть там не так... Мой мозг просто забыл про обнуление :/
0
|
03.02.2020, 17:43 | |
03.02.2020, 17:43 | |
Помогаю со студенческими работами здесь
11
Как работает write в fstream? fstream не работает и чтение и запись fstream::tellp() не работает как надо. Почему не работает код при переходе на fstream? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |