Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
81017bc1
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
81017bc1
编写于
3月 26, 2019
作者:
A
alexey-milovidov
提交者:
GitHub
3月 26, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4811 from yandex/avoid-progress-bar-flicker
Avoid progress bar flicker
上级
87e72a99
9bc4632f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
21 addition
and
11 deletion
+21
-11
dbms/programs/client/Client.cpp
dbms/programs/client/Client.cpp
+21
-11
未找到文件。
dbms/programs/client/Client.cpp
浏览文件 @
81017bc1
...
@@ -42,6 +42,7 @@
...
@@ -42,6 +42,7 @@
#include <IO/ReadBufferFromString.h>
#include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h>
#include <IO/ReadHelpers.h>
#include <IO/WriteHelpers.h>
#include <IO/WriteHelpers.h>
#include <IO/Operators.h>
#include <IO/UseSSL.h>
#include <IO/UseSSL.h>
#include <DataStreams/AsynchronousBlockInputStream.h>
#include <DataStreams/AsynchronousBlockInputStream.h>
#include <DataStreams/AddingDefaultsBlockInputStream.h>
#include <DataStreams/AddingDefaultsBlockInputStream.h>
...
@@ -1314,6 +1315,9 @@ private:
...
@@ -1314,6 +1315,9 @@ private:
/// Received data block is immediately displayed to the user.
/// Received data block is immediately displayed to the user.
block_out_stream
->
flush
();
block_out_stream
->
flush
();
/// Restore progress bar after data block.
writeProgress
();
}
}
...
@@ -1353,8 +1357,8 @@ private:
...
@@ -1353,8 +1357,8 @@ private:
void
clearProgress
()
void
clearProgress
()
{
{
std
::
cerr
<<
RESTORE_CURSOR_POSITION
CLEAR_TO_END_OF_LINE
;
written_progress_chars
=
0
;
written_progress_chars
=
0
;
std
::
cerr
<<
RESTORE_CURSOR_POSITION
CLEAR_TO_END_OF_LINE
;
}
}
...
@@ -1363,6 +1367,9 @@ private:
...
@@ -1363,6 +1367,9 @@ private:
if
(
!
need_render_progress
)
if
(
!
need_render_progress
)
return
;
return
;
/// Output all progress bar commands to stderr at once to avoid flicker.
WriteBufferFromFileDescriptor
message
(
STDERR_FILENO
,
1024
);
static
size_t
increment
=
0
;
static
size_t
increment
=
0
;
static
const
char
*
indicators
[
8
]
=
static
const
char
*
indicators
[
8
]
=
{
{
...
@@ -1377,13 +1384,15 @@ private:
...
@@ -1377,13 +1384,15 @@ private:
};
};
if
(
written_progress_chars
)
if
(
written_progress_chars
)
clearProgress
()
;
message
<<
RESTORE_CURSOR_POSITION
CLEAR_TO_END_OF_LINE
;
else
else
std
::
cerr
<<
SAVE_CURSOR_POSITION
;
message
<<
SAVE_CURSOR_POSITION
;
message
<<
DISABLE_LINE_WRAPPING
;
size_t
prefix_size
=
message
.
count
();
std
::
stringstream
message
;
message
<<
indicators
[
increment
%
8
]
message
<<
indicators
[
increment
%
8
]
<<
std
::
fixed
<<
std
::
setprecision
(
3
)
<<
" Progress: "
;
<<
" Progress: "
;
message
message
...
@@ -1398,8 +1407,7 @@ private:
...
@@ -1398,8 +1407,7 @@ private:
else
else
message
<<
". "
;
message
<<
". "
;
written_progress_chars
=
message
.
str
().
size
()
-
(
increment
%
8
==
7
?
10
:
13
);
written_progress_chars
=
message
.
count
()
-
prefix_size
-
(
increment
%
8
==
7
?
10
:
13
);
/// Don't count invisible output (escape sequences).
std
::
cerr
<<
DISABLE_LINE_WRAPPING
<<
message
.
rdbuf
();
/// If the approximate number of rows to process is known, we can display a progress bar and percentage.
/// If the approximate number of rows to process is known, we can display a progress bar and percentage.
if
(
progress
.
total_rows
>
0
)
if
(
progress
.
total_rows
>
0
)
...
@@ -1421,19 +1429,21 @@ private:
...
@@ -1421,19 +1429,21 @@ private:
if
(
width_of_progress_bar
>
0
)
if
(
width_of_progress_bar
>
0
)
{
{
std
::
string
bar
=
UnicodeBar
::
render
(
UnicodeBar
::
getWidth
(
progress
.
rows
,
0
,
total_rows_corrected
,
width_of_progress_bar
));
std
::
string
bar
=
UnicodeBar
::
render
(
UnicodeBar
::
getWidth
(
progress
.
rows
,
0
,
total_rows_corrected
,
width_of_progress_bar
));
std
::
cerr
<<
"
\033
[0;32m"
<<
bar
<<
"
\033
[0m"
;
message
<<
"
\033
[0;32m"
<<
bar
<<
"
\033
[0m"
;
if
(
width_of_progress_bar
>
static_cast
<
ssize_t
>
(
bar
.
size
()
/
UNICODE_BAR_CHAR_SIZE
))
if
(
width_of_progress_bar
>
static_cast
<
ssize_t
>
(
bar
.
size
()
/
UNICODE_BAR_CHAR_SIZE
))
std
::
cerr
<<
std
::
string
(
width_of_progress_bar
-
bar
.
size
()
/
UNICODE_BAR_CHAR_SIZE
,
' '
);
message
<<
std
::
string
(
width_of_progress_bar
-
bar
.
size
()
/
UNICODE_BAR_CHAR_SIZE
,
' '
);
}
}
}
}
}
}
/// Underestimate percentage a bit to avoid displaying 100%.
/// Underestimate percentage a bit to avoid displaying 100%.
std
::
cerr
<<
' '
<<
(
99
*
progress
.
rows
/
total_rows_corrected
)
<<
'%'
;
message
<<
' '
<<
(
99
*
progress
.
rows
/
total_rows_corrected
)
<<
'%'
;
}
}
std
::
cerr
<<
ENABLE_LINE_WRAPPING
;
message
<<
ENABLE_LINE_WRAPPING
;
++
increment
;
++
increment
;
message
.
next
();
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录