当使用工具,如bzr,doxygen和scp或wget,我看到他们都有一个不错的进度条,看起来像这样:
|=============>---------| 55% ETA 3:30
Run Code Online (Sandbox Code Playgroud)
我尝试在C++中使用该\b字符编写类似的东西,就像我之前写过的东西一样多次.输出闪烁得非常糟糕,看起来并不像上面提到的工具那么顺畅.
如何使用Python顺利创建这样的进度条(或至少更改显示的ETA)?
我的应用程序用于BackgroundWorker将文件上传到FTP服务器.一切正常,但似乎OnProgressChanged事件不应该像它应该的那样工作.
事件发生OnProgressChanged后我会完全完成RunWorkerCompleted,但事实并非如此.
在我的情况下,OnProgressChanged虽然RunWorkerComplete被触发,事件仍在触发.显然,我的进度条仍在继续,而我的文件已经完全发送到ftp服务器.
我在我的调试模式下进行了测试,我看到在RunWorkerCompletedFired 之后,OnPorgressChanged仍在工作.
我的代码在这里.
void FTP_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
try
{
string filename = e.Argument.ToString();
if (filename != string.Empty)
{
FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP;
if (!IsFolderExist(_defaultDir))
{
MakeDefaultDir(_defaultDir);
}
reqFTP = GetRequest(this._host, this._port, GetDirName(_defaultDir) + "/" + fileInf.Name, this._user, this._pass);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length; …Run Code Online (Sandbox Code Playgroud) 我不能让进度条工作!如果我执行以下代码,即使代码被执行,条形仍然为空,ReportProgress似乎没有更新任何东西..:
namespace GPUZ_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
GPUZdata test = new GPUZdata
{
};
//invio l'oggetto al thread backgroundworker
backgroundWorker1.RunWorkerAsync(test);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//
// e.Argument always contains whatever was sent to the background worker
// in RunWorkerAsync. We can simply cast it to its original type.
//
GPUZdata argumentTest = e.Argument as GPUZdata;
argumentTest.OneValue = 6;
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(50);
argumentTest.TwoValue = 3;
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(100);
//
// Now, …Run Code Online (Sandbox Code Playgroud) 好的,这是我在进度条上绘制内容的代码:
private void timer2_Tick(object sender, EventArgs e)
{
int percent = progressBar1.Value;
progressBar1.CreateGraphics().DrawString(percent.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
progressBar1.Increment(+1);
if (progressBar1.Value >= 99)
{
timer2.Stop();
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
好的,所以我在它的中间画一个标签,它会显示进度条的值.出于某种原因,它一直在闪烁......消失并再次出现.所以,有人告诉我拿出那些代码并把它放在paint方法中.....我不明白.有没有更简单的方法?
例:
在我的代码中,进度条位于70:
pbUpload.Value = 70;
foreach (string file in finalFiles)
{
//processes
//processes
}
Run Code Online (Sandbox Code Playgroud)
finalFiles具有可变长度。表示它没有固定编号。因此,基本上我需要首先弄清楚数字,这很容易,但是接下来我该如何构建一个循环,将进度条从70更新为100(100是最后一个“每个”元素)?
在以下代码中,<progress>每个cicle都会更新html5 标记的值.我还可以使用Chrome的控制台看到它的价值动态变化.但为什么渲染只在循环结束时更新?
<!doctype html>
<meta charset="utf8"></meta>
<title></title>
<body>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<button>click</button>
<progress min="0" max="10000" value="0"></progress>
<script>
$("button").click(function(){
for(var i=0; i<8000; i++)
$("progress").val(i)
})
</script>
Run Code Online (Sandbox Code Playgroud) 所以我使用这个链接来设置我的进度条,当我运行这段代码时它运行得很好.
但是,通过我的设置,我似乎无法获得实际更新的进度条... progressBar.getProgress()实际上获得了正确的进度,但UI未更新.这是迄今为止的代码:
Main.java
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("ProgressBarLayout.fxml"));
AnchorPane root = (AnchorPane) loader.load();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
ProgressBarController.java
public class ProgressBarController {
private Task copyWorker;
@FXML
private ProgressBar progressBar;
@FXML
private void onButtonClick() {
progressBar = new ProgressBar(0);
progressBar.setProgress(0);
copyWorker = createWorker();
progressBar.progressProperty().unbind();
progressBar.progressProperty().bind(copyWorker.progressProperty()); …Run Code Online (Sandbox Code Playgroud) 我想在带有Marquee样式的表单上添加ProgressBar,以向用户显示正在进行的操作.在耗时的操作期间,表单不会更新,因此ProgressBar也会"冻结".
我查了几篇关于BackgroundWorker的帖子,但在我的情况下,操作不会报告进度,这就是我需要一个Marquee栏的原因.
任何帮助或代码片段都表示赞赏.
注意:我需要使用.NET 4.0(支持XP),所以我不能使用Task.Run :(
button1_Click(object sender, EventArgs e)
{
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 50;
// INSERT TIME CONSUMING OPERATIONS HERE
// THAT DON'T REPORT PROGRESS
Thread.Sleep(10000);
progressBar1.MarqueeAnimationSpeed = 0;
progressBar1.Style = ProgressBarStyle.Blocks;
progressBar1.Value = progressBar1.Minimum;
}
Run Code Online (Sandbox Code Playgroud) 我还没有找到关于Shiny中ProgressBar的问题的解决方案,用于从数据库加载数据.我的Shiny App连接到数据库,用户直接从那里获取数据(因为我的SQL查询是被动的,数据量不同).有时数据很大,加载需要一些时间.用户不知道是否有什么事情发生或应用程序"卡住".我在我的应用程序(在output$tabelle <- DT::renderDataTable({...中)实现了最简单的流程指标,但似乎还不够:
progress <- shiny::Progress$new()
on.exit(progress$close())
progress$set(message = "Processing", value = 0)
Run Code Online (Sandbox Code Playgroud)
用户仍然有点困惑.
我想像这样smthg(在R中显示状态消息)使用?tcltk::tkProgressBar:
pb <- tkProgressBar("test progress bar", "Some information in %",
0, 100, 50)
Sys.sleep(0.5)
u <- c(0, sort(runif(20, 0 ,100)), 100)
for(i in u) {
Sys.sleep(0.1)
info <- sprintf("%d%% done", round(i))
setTkProgressBar(pb, i, sprintf("test (%s)", info), info)
}
Sys.sleep(5)
close(pb)
Run Code Online (Sandbox Code Playgroud)
有一些百分比评估从数据库加载数据的进度.
我不知道如何在我闪亮的应用程序中使用它.任何想法都会有所帮助.
提前致谢!
*一些简单的应用:
library("shiny")
library("DT")
shinyApp(
ui = fluidPage(DT::dataTableOutput('tbl')),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris) …Run Code Online (Sandbox Code Playgroud) 我已经在一个单独的线程中运行了一个查询,该查询需要一些时间来处理,因为用户目前无法知道在后台正在执行某些操作,因此我想创建一个进度条,例如该图像上的第三个进度条:
我查看了其他问题/答案,看起来就像是跑马灯进度条,我尝试将进度栏设置为跑马灯,但它什么也没做。进度栏属性如下:
MarqueeInterval = 10
Max = 100
Min = 50
Orientation = pbHorizontal
Position = 50
Smooth = True
State = pbsNormal
Step = 10
Style = pbstMarquee
Run Code Online (Sandbox Code Playgroud)
我做错了什么还是需要更改?
我的启动代码如下:
procedure TFormMain.SetupForm;
begin
// Connect to the database
ConnectToDatabase;
// Initially hide combo box
ShowHideComboBox(False);
ListViewDataType.Columns[0].Width := -1;
UsingOwnTemplate := False;
// Initial page is the welcome page
PageControl.ActivePage := TabWelcome;
end;
procedure TFormMain.ConnectToDatabase;
var
FullPath : String;
CompanyName: String;
begin
// Create the database connection
DBConnection := TFDConnection.Create(nil); …Run Code Online (Sandbox Code Playgroud)